هل تريد طلب ميزة أو الإبلاغ عن خطأ ؟
خلل برمجي.
ما هو السلوك الحالي؟
في بعض الأحيان (وليس دائمًا) يتم تسجيل خاصية الخطأ message
على أنها [object ErrorEvent]
. لقد اتبعت التنفيذ القياسي لـ Raven in Angular كما هو موضح هنا: https://docs.sentry.io/clients/javascript/integrations/angular/.
ما هو السلوك المتوقع؟
لرؤية رسالة خطأ عادية.
رافين 3.17.0
الزاوي 4.3.1
بناء Webpack
لا تستخدم CLI
إصدار CDN
هل يوجد تعريف لـ ErrorEvent
في مكان ما في مستندات Angular؟ من الواضح أن هذا لا "يرث" Error
بالطريقة الصحيحة.
قد تكون المشكلة في طريقة TraceKit traceKitWindowOnError()
، ولا يبدو أنه يأخذ في الاعتبار أن الوسيطة message
يمكن أن تكون ErrorEvent
(انظر مستندات MDN )
benvinegar هناك بعض المستندات هنا على ErrorEvent
: https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent
يتأثر بهذا أيضًا ، هؤلاء المستخدمون:
https://forum.sentry.io/t/reporting-object-errorevent/1807
[email protected] (ولكنه يحدث منذ فترة في الإصدارات الأقدم أيضًا)
الزاوي 4.x
باستخدام CLI
نفس الشيء هنا مع Ionic 3 و [email protected]
<script>
undefined.foo();
</script>
^ تم تسجيل هذا في html الخاص بك في رحلات السفاري عبر الحارس كـ [object ErrorEvent]
. الرسالة الصحيحة ستكون TypeError: undefined is not an object (evaluating 'undefined.foo')
.
لدينا برنامج نصي خارجي يقوم بحقن التعليمات البرمجية عبر علامة البرنامج النصي التي تحاول إنشاء إطار iframe ، ولكن تم حظره بواسطة Safari. نظرًا لأن الخطأ ينشأ من علامة البرنامج النصي المحقون ، فإن الحارس يبلغ فقط [object ErrorEvent]
تم الإبلاغ عن خطأ آخر من الحارس على أنه [object Event]
من flowplayer. لاعب التدفق يفعل
jQueryElement.trigger('error', [api, {code: 5}]);
يمكنك إعادة إنتاجه من خلال تضمين jQuery والقيام بما يلي:
$('div:first').trigger('error')
يرى الحارس شيئًا كهذا
بالتأكيد هذا ليس قابلاً للتسلسل ، ولكن خطأ مثل error on element from jQuery - context <div class="foo><div class="bar" ...
سيكون أكثر فائدة من [object Event]
كما تتأثر بهذا.
daangeerdinkjdelaunerosslaverytgensol يمكن لشخص ما أن توفر أصغر كود الممكن أن يمكن أن تساعدني إنتاج هذه؟
لقد راجعت sod للتو ، ويقدم Safari 10.1.2 الرسالة الصحيحة في السيناريو الذي ذكرته أعلاه.
أنا شخصياً لا أستطيع تقديم نسخة من الأخطاء ، لأن الأخطاء مبهمة للغاية ولا يمكنني تمييز أي جزء من قاعدة الكود الخاص بي يتسبب في حدوث الخطأ. ليس لدي أي تتبعات مكدس للعمل معها ، ولا رسالة خطأ لمعرفة ما إذا كان هذا هو الكود الخاص بي ، أو مكتبة طرف ثالث ، وما إلى ذلك.
آمل أن يكون لدى شخص آخر مثال مبسط يمكنه تقديمه ، آسف لم أستطع تقديم المزيد من المساعدة.
نحن نواجه هذه المشكلة أيضًا. يمكنني مشاركة بعض البيانات من آخر 10 أيام (22 ألف حدث من هذا النوع ، 13 ألف مستخدم). آمل أن يساعدك على إعادة إنتاجه.
kamilogorek لدينا مليوني خطأ من هذا النوع. اعتقدت أنها كانت مشكلتنا ، لكننا لم نتمكن من تتبعها بشكل صحيح.
لقد وجدت المشكلة. لا يتم التعامل مع ErrorEvent
كخطأ بواسطة وظيفة الاستخدام isError
، والتي يمكن العثور عليها هنا . للراحة ، سوف ألصق تعريف الوظيفة أيضًا:
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;
}
}
لقد أجريت اختبارًا سريعًا في وحدة التحكم الخاصة بي لمعرفة ما إذا كانت هذه الوظيفة ستعود إلى قيمة ErrorEvent
، ولم تفعل:
isError
في طريقة captureException
لتحديد ما إذا كانت معلمة الاستثناء خطأ أو مجرد رسالة. سيرسل captureException
استثناءات إلى لوحة التحكم باستخدام captureMessage
إذا كان يعتقد أن الاستثناء ليس _ في الواقع_ خطأ. في هذه الحالة ، لن يحسب Raven تتبع المكدس أو "يعالج" الاستثناء. إنه يرسلها كما هي.
هل هناك أي سبب يمنعنا من تحديث isError
للعودة إلى ErrorEvent
العناصر
هل هناك أي سبب يمنعنا من تحديثه هو أن الخطأ يعود إلى كائنات ErrorEvent؟
نعم. لأنه في الواقع ليس منحدرًا من Error
(إنه منحدر من Event
). ليس لديها خاصية stack
، على سبيل المثال (AFAICT ، اللعب في وحدة التحكم). مما يعني أنه قد لا تتم معالجته بشكل صحيح بالفعل.
سيكون من الرائع رؤية مثال على كيفية إنشاء هذا الخطأ بشكل مباشر ، حتى نتمكن من تحديد أفضل طريقة لمعالجته.
منشئ ErrorEvent
يأخذ Error
، لذلك يمكنك التعامل معهم بسهولة مثل:
if (isErrorEvent(ex)) {
ex = ex.error;
}
يمكنك رؤية تعريف البناء هنا . على وجه الخصوص ، انظر إلى التجزئة ErrorEventInit
. إنها معلمة اختيارية ، لذا أعتقد أن الحل الذي نشرته أعلاه لا يتعامل مع الحالة التي يكون فيها ErrorEvent.error
غير محدد.
بالتأكيد ، أعتقد أن هذا يمكن حله - لقد قصدت فقط أنه ليس بهذه البساطة مثل زيادة isError
لإرجاع true
.
أفهم. سأقوم بعرض العلاقات العامة في بضع دقائق.
ثابت في 3.19.x
شكراshcallaway! 👍
يبدو أننا ما زلنا نتلقى هذه المشكلة على 3.19.1
🤔
PhilippSpo من أي متصفح يأتي هذا الحدث؟ ErrorEvent
غير مدعوم في بعض متصفحات الجوال القديمة و IE لذلك كان علينا الرجوع إلى الحل العادي.
kamilogorek كروم 61.0.3163
أراه على Chrome 61 أيضًا. 😕 سأحاول النظر في الأمر قريبًا.
شكرا shcallaway
يحدث أيضًا في Safari 11.0 و Mac OS 10.13
يبدو أن traceKitWindowOnError لا يعالج معلمات الإدخال بشكل صحيح عندما تكون معلمة "message" هي كائن ErrorEvent:
و "ex" غير محدد. بعد ذلك ، يستدعي notifyHandlers مع كائن حيث يكون حقل "message" هو ErrorEvent وليس سلسلة:
والتي ، عند تحديدها في _makeRequest ، تنتج رسالة لا معنى لها.
شكرًا على التحقيق @ michal-rumanek ، سأحاول معالجة هذه المشكلة قريبًا (ليس لدي وقت فراغ هذا الأسبوع).
kamilogorek ، أي تقدم؟ ؛-)
مرحبًا ، أتلقى الكثير من هذه الأخطاء [object Object]
.
الزاوي 4
كروم 62.0.3202
Raven-js 3.20.1
التعليق الأكثر فائدة
لقد وجدت المشكلة. لا يتم التعامل مع
ErrorEvent
كخطأ بواسطة وظيفة الاستخدامisError
، والتي يمكن العثور عليها هنا . للراحة ، سوف ألصق تعريف الوظيفة أيضًا:لقد أجريت اختبارًا سريعًا في وحدة التحكم الخاصة بي لمعرفة ما إذا كانت هذه الوظيفة ستعود إلى قيمة
ErrorEvent
، ولم تفعل:isError
في طريقةcaptureException
لتحديد ما إذا كانت معلمة الاستثناء خطأ أو مجرد رسالة. سيرسلcaptureException
استثناءات إلى لوحة التحكم باستخدامcaptureMessage
إذا كان يعتقد أن الاستثناء ليس _ في الواقع_ خطأ. في هذه الحالة ، لن يحسب Raven تتبع المكدس أو "يعالج" الاستثناء. إنه يرسلها كما هي.هل هناك أي سبب يمنعنا من تحديث
isError
للعودة إلىErrorEvent
العناصر