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"
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!
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
aufError
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.