Sentry-javascript: BUG: Version 3.23.2 verursachte eine Änderung der Ausnahmemeldungen aufgrund eines Nicht-Fehler-Ausnahme-Serialisierers

Erstellt am 15. März 2018  ·  3Kommentare  ·  Quelle: getsentry/sentry-javascript

in Release 3.23.2 das neue Feature „Sensible non-Error exception serializer“ (#1253) verursacht Fehler, die mit es6-error gemacht werden (https://www.npmjs.com/package/es6-error) um den Fehlerinhalt zu ändern.
In dieser Zeile wird die Funktion captureException geändert:

options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);

Um genauer zu sein, hier ist mein Code:

import ExtendableError from 'es6-error'

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

export default CustomError

dann im Code:

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

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

Hilfreichster Kommentar

@zivl Wenn Sie es lokal testen und Ihre eigene custom-error.js -Datei mit diesem Code erstellen und als Modul importieren, funktioniert es ordnungsgemäß.

Das Problem ist, dass diese Bibliothek ihren Code nicht "wie er ist" exportiert, sondern ihn mit Babel vorkompiliert.

Sooo, es endet als "irgendwie" Fehler, aber nicht wirklich. Es ist ein einfaches Objekt, das bestimmte Eigenschaften erbt und ein prototype auf Error selbst gesetzt hat.

Leider gibt es keine andere Möglichkeit, als die Prüfreihenfolge zu ändern, da dies wie ein "Schrödinger-Fehler" ist. Es ist und ist gleichzeitig kein Fehler.

Alle 3 Kommentare

Das scheint ein sehr seltsames Verhalten von JS-Modulen zu sein.

Wenn Sie verwenden:

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

Es wird fälschlicherweise true/true/false gemeldet.

Wenn Sie jedoch die import -Anweisung durch den Code selbst ersetzen

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

es wird korrekt false/true/false gemeldet.

Ich werde versuchen zu debuggen, warum dies der Fall ist, und wenn ich es nicht herausfinden kann, tauschen wir einfach die Überprüfungen aus, um zuerst isError durchzugehen.

@zivl Wenn Sie es lokal testen und Ihre eigene custom-error.js -Datei mit diesem Code erstellen und als Modul importieren, funktioniert es ordnungsgemäß.

Das Problem ist, dass diese Bibliothek ihren Code nicht "wie er ist" exportiert, sondern ihn mit Babel vorkompiliert.

Sooo, es endet als "irgendwie" Fehler, aber nicht wirklich. Es ist ein einfaches Objekt, das bestimmte Eigenschaften erbt und ein prototype auf Error selbst gesetzt hat.

Leider gibt es keine andere Möglichkeit, als die Prüfreihenfolge zu ändern, da dies wie ein "Schrödinger-Fehler" ist. Es ist und ist gleichzeitig kein Fehler.

@zivl veröffentlicht in 3.23.3 . Danke für den Bericht!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen