Ravenμ΄ λμ Έμ§ λͺ¨λ μ€λ₯λ₯Ό κΈ°λ‘νκ² νλ λ°©λ²μ΄ μμ΅λκΉ? μ΄λ€ μ΄μ λ‘ μΌλΆ throw
νΈμΆμ κΈ°λ‘νμ§λ§ λ€λ₯Έ νΈμΆμ κΈ°λ‘νμ§ μμ΅λλ€. νΈμΆ μ€ν μλμ μ€μ²©λ λμμ κΈ°λ‘νμ§ μλ κ²½ν₯μ΄ μμμ λ°κ²¬νμ΅λλ€.
νν, Javascriptμ μ€λ₯ μ²λ¦¬λ μ λ§ λμ°ν©λλ€. μ€λ₯κ° λ°μνλ λ°©λ²μ λν μλ₯Ό μ 곡ν μ μμ΅λκΉ?
μλ₯Ό λ€μ΄, λ¬Έμμ΄μ λμ§λ©΄ λ³΄λΈ λ©μμ§λ₯Ό μ μΈνκ³ λ μ΄λ€ μ 보λ μ»μ μ μμ΅λλ€. μ€μ Error
κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ€νμ μ»μ μ μμ΅λλ€(μλ).
λ°λΌμ μ λ³΄κ° λ§μμλ‘ μ’μ΅λλ€.
λ¬Όλ‘ .
λ€μκ³Ό κ°μ μ€λ₯κ° λ°μν©λλ€.
throw new Error("Error");
μΌνΈλ¦¬μ λ‘κ·ΈμΈν λλ μκ³ κ·Έλ μ§ μμ λλ μμ΅λλ€.
μ΄λμ κ° λ³Ό μ μλ νμ΄μ§μΈκ°μ? μλλ©΄ μ΄λκ°μ λ£μ μ μμ΅λκΉ? μμ§ν, κ·Έκ²λ§μΌλ‘λ μ λ³΄κ° μΆ©λΆνμ§ μμ΅λλ€. μ€λ₯κ° κΈ°λ‘λμ§ μλ μ΄μ λ₯Ό μ€λͺ ν μ μλ μ½ 10κ°μ§ μμΈμ΄ μμΌλ©° λλΆλΆμ μ°λ¦¬μ μμ λ²μ΄λ μμ΅λλ€. :) λ°λΌμ μ 체 컨ν μ€νΈλ₯Ό λ³Ό μ μλ€λ©΄ λΈλΌμ°μ λ₯Ό λμΈ μ μλ μ μμ λ릴 μ μμ΅λλ€.
μ±μ μ€μ λ‘ require.jsλ₯Ό μ¬μ©νμ¬ JavaScriptλ‘ μ»΄νμΌλλ CoffeeScriptλ‘ μμ±λμμ΅λλ€. μ£Όμ μ§μ μ μ λ€μκ³Ό κ°μ΅λλ€.
Raven.config('http://[email protected]');
Raven.context(function() {
define(['cs!csmain']);
});
context
λνΌ μμ΄λ μλνμ§λ§ μ무 κ²λ λ³κ²½λμ§ μμ κ² κ°μ΅λλ€. μ¬μ ν μλμ μλ νΈμΆμ 무μνλ©΄μ νΈμΆ μ€νμμ μμμ μ΄λ£¨μ΄μ§ throw
νΈμΆμ κΈ°λ‘νμ΅λλ€.
Raven.install()
μ(λ₯Ό) μ€ν μ€μ
λκΉ?
κ·Έλ¦¬κ³ require.jsμ κ²½μ° λͺ μμ μΌλ‘ λͺ¨λμ λννλ €λ©΄ λ€μμ μνν©λλ€.
define(['module'], Raven.wrap(function(module) {
// insert cool stuff here
}));
μ€λν«μμ μμ΄λ²λ Έμ§λ§ config()
install()
λ₯Ό νΈμΆν©λλ€.
λͺ¨λμ λλ¬μΈλ μλλ ν΄λ³΄μ§ μμμ§λ§ μ΄λ―Έ μ΄λ€ κ³³μμλ μλνλ€λ©΄ λ€λ₯Έ κ³³μμλ μ λλ μ΄μ κ° λ¬΄μμΌκΉμ?
κ·Έκ²μ λͺ¨λ μ€μ λ‘ νΈμΆ μ€νμ λ¬λ € μμ΅λλ€. μΌμ΄ λΉλκΈ°νλκΈ° μμνλ©΄ κ±°μΉ μ΄μ§λλ€. μλ₯Ό λ€μ΄ μμλλ‘ μλνμ§ μμ΅λλ€.
Raven.context(function() {
setTimeout(function() {
throw new Error('crap');
}, 1);
});
λ΄λΆ κΈ°λ₯μ κΈ°λ³Έ 컨ν μ€νΈ μΈλΆμ μ체 컨ν μ€νΈμμ μ€νλ©λλ€. Node.jsλ "λλ©μΈ"μ΄λΌλ κ²μΌλ‘ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ§λ§ μ¬νκ²λ κ·Έλ° κ²λ€μ λΈλΌμ°μ μμμ μ‘΄μ¬νμ§ μμ΅λλ€.
λ°λΌμ μ€λ₯κ° ν¬μ°©λμ§ μκ³ λ§¨ λκΉμ§ κ±°νμ΄ λ°μνλ©΄ ν΄λΉ μμ μμ 100% μΈλͺ¨κ° μκΈ° λλ¬Έμ μΌλ°μ μΌλ‘ κ±°λΆλ©λλ€.
μ, μκ² μ΅λλ€. window.onerror
λ₯Ό νμ©νλ λ°©λ²μ΄ μμκΉμ?
FWIW, κ°λ₯ν κ²½μ° μμΈλ₯Ό μΊ‘μ²νλ κ°μ₯ νμ€ν λ°©λ²μ Raven.captureException
λ₯Ό λͺ
μμ μΌλ‘ μ¬μ©νλ κ²μ
λλ€. κ·Έκ²μ΄ νμ κ°λ₯ν κ²μ μλμ§λ§ μ°Έκ³ μ©μΌ λΏμ΄λΌλ κ²μ μ΄ν΄ν©λλ€.
λ°λΌμ λͺ μμ try...except λΈλ‘μ΄ κ°μ₯ μμ μ μ λλ€.
try {
throw new Error('something');
} catch(e) {
Raven.captureException(e);
}
μ€λ₯Έμͺ½. λ¬Όλ‘ μλμΌλ‘ μλ¬λ₯Ό μ‘μλ΄λ©΄ μ’κ² μ§λ§, μλ°μ€ν¬λ¦½νΈλ κ²μμ μ½κ² ν μ μλ κ²μμ΄ μλλλ€...
@ν¨ν° ββμλμ. :) κ·Έλ¦¬κ³ κ·Έκ²μ μ¬λ―Έμλ λΆλΆμ
λλ€. window.onerrorμ μ€λ₯κ° λ°μνλ©΄ λ μ΄μ μ€μ Error
κ°μ²΄κ° μλλλ€. μΈλͺ¨μλ λμΌλ‘ μΆμλ©λλ€. λν λλ©μΈ κ° λ³΄μ λ¬Έμ λ λΆκ³Όν©λλ€. λ°λΌμ κΈ°λ³Έμ μΌλ‘ μ€λ₯κ° window.onerror
μ λλ¬νλ©΄ μ°λ¦¬κ° κ°μ§ μ μΌν μ 보λ "Script error."
μΌ μ μκΈ° λλ¬Έμ μΌλ°μ μΌλ‘ νκΈ°λ©λλ€.
μ§μ¦λλ€. μ€, μ€λͺ κ°μ¬ν©λλ€!
μλμ, μλ°μ€ν¬λ¦½νΈλ κ·Έλ μ§ μμ΅λλ€. μ λ§ λμ°ν©λλ€. :) λλ μ°λ¦¬μκ² λ λμ μ 보λ₯Ό μ 곡νκΈ° μν΄ λΈλΌμ°μ λ₯Ό μ
μ©νλ λ°©λ²μ μ κ·Ήμ μΌλ‘ μ°κ΅¬νκ³ νꡬνκ³ μμ΅λλ€. Function.prototype.call
μμμ΄ ν¨μΉμ λν μμ΄λμ΄κ° λ΄ λ§μμ λμ΄μ°μ΅λλ€. κ·Έλ¬λ κ·Έκ²μ μλ§λ μ λ§ λμ μμμΌ κ²μ
λλ€.
μμ ν! λ¬Έμλ₯Ό λͺ νν νκΈ° μν κΆμ₯ μ¬νμ΄λ μ μ μ¬νμ΄ μμΌλ©΄ μλ €μ£Όμμμ€. λλ νμ κ·Έ 물건μ μ°Ύκ³ μμ΅λλ€.
κ·Έλ κ² ν κ²μ λλ€. κ΅¬μ± λ° μ¬μ© λ¬Έμλ λ§€μ° κ°λ¨νκ³ λ°λΌνκΈ° μ½μ΅λλ€.
μ΄ μμ
μ μννκΈ° μν΄ Error
μ νμ₯νλ λ°©λ²μ΄ μλμ§ κΆκΈν©λλ€.
@mattrobenolt , μ΄κ²μ CoffeeScriptλ₯Ό μ¬μ©νμ¬ μ°λ¦¬κ° μ·¨νκ³ μλ μ κ·Ό λ°©μμ λλ€.
window.Error = class extends Error
constructor: ->
error = super
Raven.captureException error
return error
κ·Έλ° λ€μ throw new Error "Test Error"
λ₯Ό μ¬μ©νμμμ€.
μ€λͺ μ μν΄ μμ μ€λͺ μ μ λ°μ΄νΈνμ΅λλ€.
ν . μ£Όλ§μ μ΄κ²μΌλ‘ λμμ. λ§μ§λ§μΌλ‘ μλνμ§λ§ window.Error ν¨μΉλ₯Ό νμ©νμ§ μμ΅λλ€. λ λ§μ λΈλΌμ°μ μμ λ€μ μλνκ³ κ°λ₯νμ§ νμΈνκ² μ΅λλ€.
κ°μ¬ν©λλ€!
λν μΌλ° Javascriptλ‘ μ 곡ν μ μμ΅λκΉ? λλ κ·Έκ²μ΄ 무μμνκ³ μλμ§ κ½€ νμ ν©λλ€. λλ λ¨μ§ λ€μ νμΈνκ³ μΆμ΅λλ€. λλ Coffeescriptλ₯Ό μ°μ§ μλλ€.
μ¬κΈ° μμ΅λλ€:
var __hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
window.Error = (function(_super) {
__extends(_Class, _super);
function _Class() {
var error;
error = _Class.__super__.constructor.apply(this, arguments);
Raven.captureException(error);
return error;
}
return _Class;
})(Error);
μ§κΈ μκ°νλ©΄ μ΄κ²μ μλͺ»λ μ κ·Ό λ°©μμ λλ€. μμ±μλ₯Ό μ¬μ μνλ κ²λ§μΌλ‘λ Ravenμ λͺ¨λ μ€λ₯ κ°μ²΄κ° λ°μνλμ§ μ¬λΆμ κ΄κ³μμ΄ λͺ¨λ μ€λ₯ κ°μ²΄λ₯Ό μΊ‘μ²νκ² λ©λλ€. :)
μ°Έκ³ λ‘ errorceptionμ μ΄λ₯Ό μ²λ¦¬νλ λ°©λ²μ μ°Ύμμ΅λλ€. raven-jsκ° λμΌν μμ μ μνν μ μλ€λ©΄ λ©μ§ κ²μ λλ€.
@dmcquay Errorceptionμ΄ μΊ‘μ²ν μλ₯Ό μ 곡ν μ μμ΅λκΉ? μλ§ λ¦¬λ²μ€ μμ§λμ΄λ§ ν μ μμ΅λλ€.
λλ μ€μ λ‘ λͺ¨λ JS μ€λ₯ νΈλ€λ¬κ° 50% raven.jsλΌκ³ κ°μ ν©λλ€ ;)
:λ₯:
@BYK , μ΄λ€ μμ΄λμ΄κ° μμ΅λκΉ?
λλ errorceptionμ λν λ΄λΆ μ§μμ΄ μμ΅λλ€. μλΉμ€λ₯Ό μ¬μ©νκ³ μμΌλ©° κ΄κ³ ν λλ‘ μλνλ κ² κ°μ΅λλ€. κ·Έκ² λ΄κ° μλ μ λΆ μΌ.
λλ κ·Έλ€μ΄ μ΄λ»κ² μλνλμ§ μ‘°μ¬νκ³ λ¨μν window.onerror
μ μμ μ μ°κ²°νκ³ μ€ν μΆμ μ μ κ²½ μ°μ§ μλ κ²μ²λΌ 보μ
λλ€. μ μ΄λ μ΄λ° μ’
λ₯μ κ²λ€μ λν΄μλ.
μ€λ₯ κ°μ²΄λ₯Ό νμ΄μ¬νΉνλ κ²μ Firefoxμμ μλνμ§λ§ @mattrobenolt μ λͺ¨λ μΊ‘μ²μ λν μμ μ throwλμ§ μμ κ°μ²΄λΌλ μ ν¨ν λ¬Έμ μ λλ€.
μ΄μ λν λλ¬μ΄ ν΄κ²° λ°©λ²μ μμ±λ Error
μΈμ€ν΄μ€λ₯Ό μ μ μμ±μλ₯Ό νμ΄μ¬νΉνμ¬ μ μ₯νκ³ onerror
λ₯Ό λ£κ³ message
, fileName
λ° lineNo
λ₯Ό λΉκ΅νλ κ²μΌ μ μμ΅λλ€.
λͺ¨λ μ€λ₯ μλ¦Ό μλΉμ€λ₯Ό νκ°νλ λμ μΌλΆ Javascript κ΄λ ¨ μλΉμ€(μ: https://qbaka.com/)κ° μ€ν μΆμ μ μΆμ νκ³ νΉμ μ€λ₯λ₯Ό μ λ°ν μ¬μ©μ μμ μ νμνλ€λ κ²μ μμμ΅λλ€. λ무 λμ errorceptionμ λ€λ₯Έ λͺ¨λ λ©΄μμ μ°μν΄ λ³΄μ΄κΈ° λλ¬Έμ κ·Έλ κ² νμ§ μμ΅λλ€.
μ°λ¦¬λ Django μ½λμ Sentryλ₯Ό μ¬μ©ν κ²μ΄λ©° Sentryκ° Javascriptμμ μλνλ λ°©μμ λν μ 보λ₯Ό μ°Ύλ λμ μ΄ λ¬Έμ λ₯Ό λ°κ²¬νμ΅λλ€. raven-jsμ νμ¬ κ΅¬νμμλ λͺ¨λ JS μ€λ₯λ₯Ό λͺ μμ μΌλ‘ ν¬μ°©νκ³ Sentryμ λ³΄κ³ νλ μ½λκ° νμν©λκΉ?
@adityar7 κ·Έλ μ§ μμ΅λλ€. Raven.jsλ κ°λ₯ν ν μμμ΄ ν¨μΉλ₯Ό μ μ©νκ³ κ°λ‘μ±λ κ²μ΄ κ°μ₯ μ’μ΅λλ€. λ λ§μ κ²½μ°μλ λͺ μμ μΌλ‘ λνν΄μΌ ν μλ μμ§λ§ μλμΌλ‘ μΌμ΄ λ°μνλλ‘ νκΈ° μν΄ μ λ§ μ΄μ¬ν λ Έλ ₯ν©λλ€.
@mattrobenolt μΌλΆ ꡬ문μ μμ νμ¬ μλνλλ‘ νμ΅λλ€. κ°μ¬ ν΄μ!
κ°μ₯ μ μ©ν λκΈ
μ¬κΈ° μμ΅λλ€: