Sentry-javascript: BUG: تسبب الإصدار 3.23.2 في تغيير رسائل الاستثناء بسبب عدم وجود خطأ في جهاز التسلسل

تم إنشاؤها على ١٥ مارس ٢٠١٨  ·  3تعليقات  ·  مصدر: getsentry/sentry-javascript

في الإصدار 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"

التعليق الأكثر فائدة

zivl عند اختباره محليًا ، وإنشاء ملف custom-error.js الخاص بك باستخدام هذا الرمز واستيراده كوحدة نمطية ، فإنه يعمل بشكل صحيح.

المشكلة هي أن هذه المكتبة لا تصدر كودها "كما هي" ، لكنها تجمعها مسبقًا باستخدام Babel.

سوو انتهى الأمر بكونه خطأ "كيندا" ولكن ليس في الحقيقة. إنه كائن عادي يرث خصائص معينة ويحتوي على prototype مضبوطًا على Error نفسه.

لسوء الحظ ، لا توجد طريقة للتغلب على هذا الأمر بخلاف تغيير أمر الشيك ، لأنه يشبه "خطأ شرودنغر". إنه ليس خطأ في نفس الوقت.

ال 3 كومينتر

يبدو أن هذا سلوك غريب جدًا لوحدات 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 . شكرا على التقرير!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات