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