dans la version 3.23.2, la nouvelle fonctionnalité "Sérialiseur d'exception sensible sans erreur" (#1253) provoquant des erreurs qui sont faites avec es6-error
(https://www.npmjs.com/package/es6-error) pour modifier le contenu de l'erreur.
il est en cours de modification dans la fonction captureException
dans cette ligne :
options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);
pour être plus précis, voici mon code :
import ExtendableError from 'es6-error'
class CustomError extends ExtendableError {
constructor(code, message) {
super(message)
this.name ='CustomError'
this.code = code
}
}
export default CustomError
puis dans le code :
Raven.captureException(new CustomError('code123', 'not working'));
// this will cause the error message to be "Non-Error exception captured with keys: code"
Cela semble être un comportement très étrange des modules JS.
Lorsque vous utilisez :
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))
Il rapportera par erreur true/true/false
.
Cependant, lorsque vous remplacerez l'instruction import
par le code lui-même
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,
});
}
}
il rapportera correctement false/true/false
.
Je vais essayer de déboguer pourquoi c'est le cas et si je ne peux pas le savoir, nous échangerons simplement les chèques pour passer d'abord par isError
.
@zivl Lorsque vous le testez localement et que vous créez votre propre fichier custom-error.js
avec ce code et que vous l'importez en tant que module, cela fonctionne correctement.
Le problème est que cette bibliothèque n'exporte pas son code "tel quel", mais le précompile à l'aide de Babel.
Sooo ça finit par être "un peu" erreur mais pas vraiment. C'est un objet simple qui hérite de propriétés spécifiques et a un prototype
défini sur le Error
lui-même.
Il n'y a malheureusement pas d'autre moyen de contourner cela que de changer l'ordre des chèques, car c'est comme une "erreur de schrödinger". C'est et ce n'est pas une erreur en même temps.
@zivl est sorti en 3.23.3
. Merci pour le rapport !
Commentaire le plus utile
@zivl Lorsque vous le testez localement et que vous créez votre propre fichier
custom-error.js
avec ce code et que vous l'importez en tant que module, cela fonctionne correctement.Le problème est que cette bibliothèque n'exporte pas son code "tel quel", mais le précompile à l'aide de Babel.
Sooo ça finit par être "un peu" erreur mais pas vraiment. C'est un objet simple qui hérite de propriétés spécifiques et a un
prototype
défini sur leError
lui-même.Il n'y a malheureusement pas d'autre moyen de contourner cela que de changer l'ordre des chèques, car c'est comme une "erreur de schrödinger". C'est et ce n'est pas une erreur en même temps.