في الإصدار 3.23.2 ، الميزة الجديدة "برنامج تسلسل استثناء غير خطأ معقول" (# 1253) يتسبب في حدوث أخطاء باستخدام es6-error
(https://www.npmjs.com/package/es6-error) لتغيير محتوى الخطأ.
يتم تغييره في دالة captureException
في هذا السطر:
options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);
لكي أكون أكثر تحديدًا ، إليك الكود الخاص بي:
import ExtendableError from 'es6-error'
class CustomError extends ExtendableError {
constructor(code, message) {
super(message)
this.name ='CustomError'
this.code = code
}
}
export default CustomError
ثم في الكود:
Raven.captureException(new CustomError('code123', 'not working'));
// this will cause the error message to be "Non-Error exception captured with keys: code"
يبدو أن هذا سلوك غريب جدًا لوحدات JS.
عندما تستخدم:
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))
سيبلغ عن true/true/false
بشكل غير صحيح.
ومع ذلك ، عندما تستبدل import
كشف الحساب بالشفرة نفسها
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,
});
}
}
سيبلغ بشكل صحيح عن false/true/false
.
سأحاول تصحيح سبب ذلك ، وإذا لم أتمكن من اكتشاف ذلك ، فسنقوم فقط بتبديل الشيكات للمرور عبر isError
أولاً.
zivl عند اختباره محليًا ، وإنشاء ملف custom-error.js
الخاص بك باستخدام هذا الرمز واستيراده كوحدة نمطية ، فإنه يعمل بشكل صحيح.
المشكلة هي أن هذه المكتبة لا تصدر كودها "كما هي" ، لكنها تجمعها مسبقًا باستخدام Babel.
سوو انتهى الأمر بكونه خطأ "كيندا" ولكن ليس في الحقيقة. إنه كائن عادي يرث خصائص معينة ويحتوي على prototype
مضبوطًا على Error
نفسه.
لسوء الحظ ، لا توجد طريقة للتغلب على هذا الأمر بخلاف تغيير أمر الشيك ، لأنه يشبه "خطأ شرودنغر". إنه ليس خطأ في نفس الوقت.
تم إصدار zivl في 3.23.3
. شكرا على التقرير!
التعليق الأكثر فائدة
zivl عند اختباره محليًا ، وإنشاء ملف
custom-error.js
الخاص بك باستخدام هذا الرمز واستيراده كوحدة نمطية ، فإنه يعمل بشكل صحيح.المشكلة هي أن هذه المكتبة لا تصدر كودها "كما هي" ، لكنها تجمعها مسبقًا باستخدام Babel.
سوو انتهى الأمر بكونه خطأ "كيندا" ولكن ليس في الحقيقة. إنه كائن عادي يرث خصائص معينة ويحتوي على
prototype
مضبوطًا علىError
نفسه.لسوء الحظ ، لا توجد طريقة للتغلب على هذا الأمر بخلاف تغيير أمر الشيك ، لأنه يشبه "خطأ شرودنغر". إنه ليس خطأ في نفس الوقت.