Sentry-javascript: рдмрдЧ: рд░рд┐рд▓реАрдЬ 3.23.2 рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдЕрдкрд╡рд╛рдж рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдХрд╛рд░рдг рдЕрдкрд╡рд╛рдж рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдорд╛рд░реНрдЪ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: getsentry/sentry-javascript

рд░рд┐рд▓реАрдЬрд╝ 3.23.2 рдореЗрдВ, рдирдИ рд╕реБрд╡рд┐рдзрд╛ "рд╕реЗрдВрд╕рд┐рдмрд▓ рдиреЙрди-рдПрд░рд░ рдПрдХреНрд╕реЗрдкреНрд╢рди рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░" (#1253), рдЬреЛ es6-error (https://www.npmjs.com/package/es6-error) рдХреЗ рд╕рд╛рде рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИред рддреНрд░реБрдЯрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕реЗ рдЗрд╕ рд▓рд╛рдЗрди рдореЗрдВ captureException рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:

options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);

рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдВ рд╣реИ:

import ExtendableError from 'es6-error'

class CustomError extends ExtendableError {
  constructor(code, message) {
    super(message)
    this.name ='CustomError'
    this.code = code
  }
}

export default CustomError

рдлрд┐рд░ рдХреЛрдб рдореЗрдВ:

Raven.captureException(new CustomError('code123', 'not working'));

// this will cause the error message to be "Non-Error exception captured with keys: code"

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

@zivl рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА custom-error.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ "рдЬреИрд╕рд╛ рд╣реИ" рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реАрдХрдВрдкрд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реИред

Sooo рдпрд╣ "рдереЛрдбрд╝реЗ" рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рдпрд╣ рдПрдХ рд╕рд╛рджрд╛ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдгреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ prototype рдХреЛ Error рдкрд░ рд╣реА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЪреЗрдХ рдСрд░реНрдбрд░ рдмрджрд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╢реНрд░реЛрдбрд┐рдВрдЧрд░ рддреНрд░реБрдЯрд┐" рдЬреИрд╕рд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдирд╣реАрдВ рд╣реИред

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

рдпрд╣ рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдЬрдм рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

import ExtendableError from 'es6-error'

class CustomError extends ExtendableError {
  constructor(code, message) {
    super(message)
    this.name ='CustomError'
    this.code = code
  }
}

function isPlainObject(what) {
  return Object.prototype.toString.call(what) === '[object Object]';
}

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

function isErrorEvent(value) {
  return Object.prototype.toString.call(value) === '[object ErrorEvent]';
}

var ex = new CustomError('code123', 'not working');

console.log('isPlainObject:', isPlainObject(ex))
console.log('isError:', isError(ex))
console.log('isErrorEvent:', isErrorEvent(ex))

рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ true/true/false рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдЖрдк рдХреЛрдб рдХреЗ рд╕рд╛рде import рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ

class ExtendableError extends Error {
  constructor(message = '') {
    super(message);

    // extending Error is weird and does not propagate `message`
    Object.defineProperty(this, 'message', {
      configurable: true,
      enumerable : false,
      value : message,
      writable : true,
    });

    Object.defineProperty(this, 'name', {
      configurable: true,
      enumerable : false,
      value : this.constructor.name,
      writable : true,
    });

    if (Error.hasOwnProperty('captureStackTrace')) {
      Error.captureStackTrace(this, this.constructor);
      return;
    }

    Object.defineProperty(this, 'stack', {
      configurable: true,
      enumerable : false,
      value : (new Error(message)).stack,
      writable : true,
    });
  }
}

рдпрд╣ false/true/false рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдКрдВрдЧрд╛, рддреЛ рд╣рдо рдкрд╣рд▓реЗ isError рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рд╕реНрд╡реИрдк рдХрд░реЗрдВрдЧреЗред

@zivl рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА custom-error.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ "рдЬреИрд╕рд╛ рд╣реИ" рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реАрдХрдВрдкрд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реИред

Sooo рдпрд╣ "рдереЛрдбрд╝реЗ" рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рдпрд╣ рдПрдХ рд╕рд╛рджрд╛ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдгреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ prototype рдХреЛ Error рдкрд░ рд╣реА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЪреЗрдХ рдСрд░реНрдбрд░ рдмрджрд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╢реНрд░реЛрдбрд┐рдВрдЧрд░ рддреНрд░реБрдЯрд┐" рдЬреИрд╕рд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдирд╣реАрдВ рд╣реИред

@zivl 3.23.3 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

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

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

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

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

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

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