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 с этим ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эта Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ экспортируСт свой ΠΊΠΎΠ΄ Β«ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒΒ», Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Babel.

Π’Π°Π°Π°ΠΊ, это оказываСтся "своСго Ρ€ΠΎΠ΄Π°" ошибкой, Π½ΠΎ Π½Π΅ совсСм. Π­Ρ‚ΠΎ простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ свойства ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ prototype , установлСнный Π½Π° сам Error .

К соТалСнию, Π½Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ способа ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Β«ΠΎΡˆΠΈΠ±ΠΊΡƒ Π¨Ρ€Π΅Π΄ΠΈΠ½Π³Π΅Ρ€Π°Β». Π­Ρ‚ΠΎ ΠΈ Π½Π΅ являСтся ошибкой ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π­Ρ‚ΠΎ каТСтся ΠΎΡ‡Π΅Π½ΡŒ странным ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ JS.

Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅:

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 с этим ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эта Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ экспортируСт свой ΠΊΠΎΠ΄ Β«ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒΒ», Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Babel.

Π’Π°Π°Π°ΠΊ, это оказываСтся "своСго Ρ€ΠΎΠ΄Π°" ошибкой, Π½ΠΎ Π½Π΅ совсСм. Π­Ρ‚ΠΎ простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ свойства ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ prototype , установлСнный Π½Π° сам Error .

К соТалСнию, Π½Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ способа ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Β«ΠΎΡˆΠΈΠ±ΠΊΡƒ Π¨Ρ€Π΅Π΄ΠΈΠ½Π³Π΅Ρ€Π°Β». Π­Ρ‚ΠΎ ΠΈ Π½Π΅ являСтся ошибкой ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

@zivl Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ Π² 3.23.3 . Бпасибо Π·Π° ΠΎΡ‚Ρ‡Π΅Ρ‚!

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ