Sentry-javascript: BUG: rilis 3.23.2 menyebabkan perubahan pesan pengecualian karena pembuat serial pengecualian non-Error

Dibuat pada 15 Mar 2018  ·  3Komentar  ·  Sumber: getsentry/sentry-javascript

dalam rilis 3.23.2, fitur baru "Sensible non-Error exception serializer" (#1253) menyebabkan kesalahan yang dibuat dengan es6-error (https://www.npmjs.com/package/es6-error) untuk mengubah konten kesalahan.
sedang diubah dalam fungsi captureException di baris ini:

options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);

untuk lebih spesifik, ini kode saya:

import ExtendableError from 'es6-error'

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

export default CustomError

lalu di kode:

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

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

Komentar yang paling membantu

@zivl Ketika Anda mengujinya secara lokal, dan membuat file custom-error.js Anda sendiri dengan kode itu dan mengimpornya sebagai modul, itu berfungsi dengan benar.

Masalahnya adalah perpustakaan ini tidak mengekspor kodenya "sebagaimana adanya", tetapi mengkompilasinya terlebih dahulu menggunakan Babel.

Sooo itu akhirnya menjadi kesalahan "agak" tetapi tidak juga. Ini adalah objek biasa yang mewarisi properti tertentu dan memiliki prototype yang disetel ke Error itu sendiri.

Sayangnya, tidak ada jalan lain selain mengubah urutan pemeriksaan, karena ini seperti "kesalahan schrodinger". Ini adalah dan bukan merupakan Kesalahan pada saat yang bersamaan.

Semua 3 komentar

Itu tampaknya merupakan perilaku modul JS yang sangat aneh.

Saat Anda menggunakan:

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

Itu akan salah melaporkan true/true/false .

Namun, ketika Anda akan mengganti pernyataan import dengan kode itu sendiri

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

itu akan melaporkan dengan benar false/true/false .

Saya akan mencoba men-debug mengapa demikian dan jika saya tidak dapat mengetahuinya, kami hanya akan menukar cek untuk melewati isError terlebih dahulu.

@zivl Ketika Anda mengujinya secara lokal, dan membuat file custom-error.js Anda sendiri dengan kode itu dan mengimpornya sebagai modul, itu berfungsi dengan benar.

Masalahnya adalah perpustakaan ini tidak mengekspor kodenya "sebagaimana adanya", tetapi mengkompilasinya terlebih dahulu menggunakan Babel.

Sooo itu akhirnya menjadi kesalahan "agak" tetapi tidak juga. Ini adalah objek biasa yang mewarisi properti tertentu dan memiliki prototype yang disetel ke Error itu sendiri.

Sayangnya, tidak ada jalan lain selain mengubah urutan pemeriksaan, karena ini seperti "kesalahan schrodinger". Ini adalah dan bukan merupakan Kesalahan pada saat yang bersamaan.

@zivl dirilis di 3.23.3 . Terima kasih atas laporannya!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat