Sentry-javascript: рд╕рднреА рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдлрд╝рд░ре░ 2013  ┬╖  31рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: getsentry/sentry-javascript

рдХреНрдпрд╛ рд░реЗрд╡реЗрди рдХреЛ рд╕рднреА рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдпрд╣ рдХреБрдЫ throw рдХреЙрд▓ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдирд╣реАрдВред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рдиреАрдЪреЗ рдиреЗрд╕реНрдЯреЗрдб рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣реЗрдпрд░ рдпреВ рдЧреЛ:

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);

рд╕рднреА 31 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рд╣рд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрдпрд╛рдирдХ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдлреЗрдВрдХ рд░рд╣реЗ рд╣реИрдВ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлреЗрдВрдХрдиреЗ рд╕реЗ рд╣рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЛрдИ рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ Error рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдкреНрд░рдпрд╛рд╕) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА, рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд░рд╣рд╛ рд╣реВрдБ:

throw new Error("Error");

рдХрднреА-рдХрднреА рдпрд╣ рд╕рдВрддрд░реА рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдХрд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрд╛ рдЖрдк рдЗрд╕реЗ рдХрд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рд▓рдЧрднрдЧ 10 рдХрд╛рд░рдХ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рдорд╛рд░реЗ рд╣рд╛рде рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВред :) рддреЛ рдЕрдЧрд░ рдореИрдВ рдкреВрд░рд╛ рд╕рдВрджрд░реНрдн рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред

рдРрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЦреНрдп рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

Raven.config('http://[email protected]');
Raven.context(function() {
  define(['cs!csmain']);
});

рдореИрдВрдиреЗ context рд░реИрдкрд░ рдХреЗ рдмрд┐рдирд╛ рднреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА throw рдХреЙрд▓ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рдКрдкрд░ рдХрд┐рдП рдЧрдП рдереЗ рдЬрдмрдХрд┐ рдиреАрдЪреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдПред

рдХреНрдпрд╛ рдЖрдк Raven.install() рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ

рдФрд░ requ.js рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореЙрдбреНрдпреВрд▓ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдХрд░реЗрдВрдЧреЗ:

define(['module'], Raven.wrap(function(module) {
  // insert cool stuff here
}));

рдореИрдВ рдЗрд╕реЗ рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВ config() . рдХреЗ рдмрд╛рдж config() install() рдкрд░ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдореИрдВрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реЛрдВ рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рдпрд╣ рд╕рдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрд▓рд╕реНрдЯреИрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЪреАрдЬреЗрдВ async рднреВрдорд┐ рдореЗрдВ рдЬрд╛рдиреЗ рд▓рдЧрддреА рд╣реИрдВ, рддреЛ рдпрд╣ рдЦреБрд░рджрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛:

Raven.context(function() {
  setTimeout(function() {
    throw new Error('crap');
  }, 1);
});

рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдп рдореБрдЦреНрдп рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд╣рд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Node.js рдЗрд╕реЗ "рдбреЛрдореЗрди" рдирд╛рдордХ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╡реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рднреВрдорд┐ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИ рдФрд░ рд╢реАрд░реНрд╖ рдкрд░ рд╕рднреА рддрд░рд╣ рд╕реЗ рдмреБрд▓рдмреБрд▓реЗ рдмрдирддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕рдордп рдпрд╣ 100% рдмреЗрдХрд╛рд░ рд╣реИред

рдУрд╣ рд╕рдордЭрд╛ред рд╢рд╛рдпрдж window.onerror рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдЕрдкрд╡рд╛рдж рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рднрд░реЛрд╕реЗрдордВрдж рддрд░реАрдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ Raven.captureException рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ FYI рдХрд░реЗрдВред

рддреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдпрд╛рд╕ ... рдмреНрд▓реЙрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд░рд╛рдЬреНрдп рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ:

try {
  throw new Error('something');
} catch(e) {
  Raven.captureException(e);
}

рд╕рд╣реАред рдмреЗрд╢рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕реЗ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдЧреЗрдо рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ ...

@pheuter рдирд╣реАрдВред :) рдФрд░ рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ 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" . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдКрдкрд░ рдЕрджреНрдпрддрди рдЯрд┐рдкреНрдкрдгреАред

рд╣рдореНрдоред рдореИрдВ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓реВрдБрдЧрд╛ред рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣ рдореБрдЭреЗ рдЦрд┐рдбрд╝рдХреА рдкрд░ рдкреИрдЪ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрдЧрд╛ред рддреНрд░реБрдЯрд┐ред рдореИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрднрд╡ рд╣реИред

рд╕рд░ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдмрд╕ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ред

рд╣реЗрдпрд░ рдпреВ рдЧреЛ:

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);

рдЕрдм рдЬрдм рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдмрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рд╕реЗ рд░реЗрд╡реЗрди рд╣рд░ рдПрд░рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реЛ рдпрд╛ рдирд╣реАрдВред :)

рдПрдлрд╡рд╛рдИрдЖрдИ, рддреНрд░реБрдЯрд┐ рдХреЛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ред рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд░реЗрд╡реЗрди-рдЬреЗрдПрд╕ рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХреЗред

@dmcquay рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрд░рд░рд╕реЗрдкреНрд╢рди рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╕рднреА рдЬреЗрдПрд╕ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ 50% raven.js рд╣реИрдВ;)

рдкреВрдк:

@BYK , рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдореБрдЭреЗ рдПрд░рд░рд╕реЗрдкреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдВрджрд░реВрдиреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЬреНрдЮрд╛рдкрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рдкрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмрд╕ рдЦреБрдж рдХреЛ window.onerror рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдПред

рдПрд░рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░рдирд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрди рд╕рднреА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @mattrobenolt рдХреА рдмрд╛рдд, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрд┐рдиреНрд╣реЗрдВ рдлреЗрдВрдХрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд╡реИрдз рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдВрджрд╛ рд╕рдорд╛рдзрд╛рди рд╡реИрд╢реНрд╡рд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЕрдкрд╣реГрдд рдХрд░рдХреЗ рдирд┐рд░реНрдорд┐рдд Error рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдФрд░ onerror рдХреЛ рднреА рд╕реБрдирдирд╛ рдФрд░ message , fileName рдФрд░ lineNo рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА рддреНрд░реБрдЯрд┐-рд╕реВрдЪрдирд╛ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреБрдЫ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд╡рд╛рдПрдВ (рдЬреИрд╕реЗ https://qbaka.com/) рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдПрдХ рд╡рд┐рд╢реЗрд╖ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рдмрд╣реБрдд рдЦрд░рд╛рдм рдПрд░рд░рд╕реЗрдкреНрд╢рди рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд░ рддрд░рд╣ рд╕реЗ рд╢реНрд░реЗрд╖реНрда рд▓рдЧрддрд╛ рд╣реИред

рд╣рдо рдЕрдкрдиреЗ Django рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдВрддрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрддрд░реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реБрдП рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИред рдХреНрдпрд╛ рд░реЗрд╡реЗрди-рдЬреЗрдПрд╕ рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕рднреА рдЬреЗрдПрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдХрдбрд╝рдиреЗ рдФрд░ рд╕рдВрддрд░реА рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

@adityar7 рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред Raven.js рдордВрдХреА рдкреИрдЪ рдФрд░ рдЕрдЧрд░ рд╣реЛ рд╕рдХреЗ рддреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рдФрд░ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

@mattrobenolt рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдХреЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

simllll picture simllll  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rowlando picture rowlando  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Nickforall picture Nickforall  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mattkrick picture mattkrick  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mogelbrod picture mogelbrod  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ