Sentry-javascript: سجل تلقائيا جميع الأخطاء التي ألقيت؟

تم إنشاؤها على ١٠ فبراير ٢٠١٣  ·  31تعليقات  ·  مصدر: getsentry/sentry-javascript

هل هناك طريقة لجعل Raven يسجل جميع الأخطاء التي تم إلقاؤها؟ لسبب ما ، فإنه يسجل بعض المكالمات throw لكن لا يسجل البعض الآخر. لقد وجدت أنه يميل إلى عدم تسجيل السلوك المتداخل بشكل أكبر أسفل مكدس الاستدعاءات.

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

ها أنت ذا:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

ال 31 كومينتر

هاها ، التعامل مع الخطأ في جافا سكريبت أمر مروع حقًا. هل يمكنك أن تعطيني مثالاً على كيفية إلقاء الأخطاء؟

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

لذا كلما زادت المعلومات ، كان ذلك أفضل.

في الواقع.

أنا أرتكب خطأ كالتالي:

throw new Error("Error");

في بعض الأحيان يقوم بتسجيل الدخول إلى الحارس وأحيانًا لا يقوم بذلك.

هل هذا في صفحة يمكنني إلقاء نظرة عليها في مكان ما؟ أو يمكنك وضعها في مكان ما؟ بصراحة ، هذه ليست معلومات كافية. هناك حوالي 10 عوامل يمكن أن تفسر سبب عدم تسجيل خطأ ، ومعظمها خارج عن أيدينا. :) لذا إذا كان بإمكاني رؤية السياق الكامل ، يمكنني أن أقدم لك اقتراحًا لمساعدة المتصفح.

تمت كتابة التطبيق فعليًا بلغة CoffeeScript والتي يتم تجميعها إلى JavaScript باستخدام تتطلب. تبدو نقطة الدخول الرئيسية كما يلي:

Raven.config('http://[email protected]');
Raven.context(function() {
  define(['cs!csmain']);
});

لقد حاولت بدون الغلاف أيضًا context ولا يبدو أن هذا يغير شيئًا. لا يزال يقوم بتسجيل المكالمات throw التي تم إجراؤها أعلى في مكدس المكالمات مع تجاهل تلك الموجودة أدناه.

هل تقوم بتشغيل Raven.install()

أما بالنسبة إلى required.js ، إذا كنت تريد صراحةً التفاف الوحدات ، فستفعل ما يلي:

define(['module'], Raven.wrap(function(module) {
  // insert cool stuff here
}));

لقد نسيتها في المقتطف ، لكنني أتصل بـ install() بعد config()

لم أحاول الالتفاف حول الوحدات ، لكنني اكتشفت ما إذا كانت تعمل بالفعل في بعض الأماكن ، فلماذا لا في أماكن أخرى؟

كل هذا يتوقف حقا على Callstack. عندما تبدأ الأشياء بالذهاب إلى أرض غير متزامنة ، يصبح الأمر قاسيًا. على سبيل المثال ، لن يعمل هذا كما هو متوقع:

Raven.context(function() {
  setTimeout(function() {
    throw new Error('crap');
  }, 1);
});

يتم تشغيل الوظيفة الداخلية في سياقها الخاص خارج السياق الرئيسي. Node.js يحل هذه المشكلة مع شيء يسمى "المجالات" ، ولكن للأسف ، هذه غير موجودة في أرض المتصفح.

لذلك إذا لم يتم اكتشاف خطأ ما وحدث فقاعات على طول الطريق إلى القمة ، فعادة ما يتم رفضه لأنه لا قيمة له بنسبة 100٪ في تلك المرحلة.

آه لقد فهمت. ربما هناك طريقة لاستخدام window.onerror ؟

FWIW ، إن أمكن ، الطريقة الأكثر ثقة لالتقاط استثناء هي استخدام Raven.captureException بشكل صريح. أفهم أن هذا ليس ممكنًا دائمًا ، ولكن لمعلوماتك فقط.

لذا فإن المحاولة الصريحة ... ماعدا الكتلة هي موس موثوقة:

try {
  throw new Error('something');
} catch(e) {
  Raven.captureException(e);
}

حق. بالطبع سيكون من الرائع التقاط الأخطاء تلقائيًا ، لكن JavaScript لا يجعلها لعبة سهلة اللعب ...

تضمين التغريدة :) وهذا هو الجزء الممتع. بمجرد وصول الخطأ إلى window.onerror ، فإنه لم يعد كائنًا فعليًا Error . تتسطح إلى مجرد سلسلة عديمة الفائدة. ويفرض أيضًا مشكلات أمان عبر المجال. لذلك ، بمجرد وصول الخطأ إلى window.onerror ، يتم تجاهله عادةً نظرًا لأن المعلومات الوحيدة التي لدينا قد تكون فقط: "Script error." .

المصات. حسنًا ، أقدر التوضيح!

لا ، جافا سكريبت لا تفعل ذلك. إنه أمر مروع حقًا ، في الواقع. :) أنا أقوم ببحث واستكشاف طرق لاستغلال المتصفح لمنحنا معلومات أفضل. حتى أن الفكرة خطرت ببالي إلى رقعة القرد Function.prototype.call . لكن ربما تكون هذه أخبار سيئة حقًا.

تماما! إذا كان لديك أي توصيات أو اقتراحات لتوضيح الوثائق ، فيرجى إبلاغي بذلك. أنا أبحث دائمًا عن تلك الأشياء.

ستفعل ، لقد كانت مستندات التكوين والاستخدام واضحة جدًا وسهلة المتابعة.

أتساءل عما إذا كانت هناك طريقة لتوسيع Error لإنجاح هذا الأمر.

mattrobenolt ، هذا هو النهج الذي نتبعه باستخدام CoffeeScript.

window.Error = class extends Error
  constructor: ->
    error = super
    Raven.captureException error
    return error

ثم استخدم فقط throw new Error "Test Error"

تعليق محدث أعلاه للتوضيح.

همم. سوف ألعب مع هذا خلال عطلة نهاية الأسبوع. في المرة الأخيرة التي حاولت فيها ، لن يسمح لي بالتصحيح على النافذة خطأ. سأحاول مرة أخرى في المزيد من المتصفحات وأرى ما هو ممكن.

وذلك بفضل لرؤساء متابعة!

أيضا ، هل يمكن أن تعطيني ذلك في جافا سكريبت عادي؟ أنا متأكد تمامًا مما يفعله ، أريد فقط التحقق منه مرة أخرى. أنا لا أكتب Coffeescript.

ها أنت ذا:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

الآن بعد أن فكرت في الأمر ، هذا نهج معيب. سيؤدي مجرد تجاوز المُنشئ إلى قيام Raven بالتقاط كل كائن خطأ ، سواء تم إلقاؤه أم لا. :)

لمعلوماتك ، وجدت الخطأ طريقة للتعامل مع هذا. سيكون رائعًا إذا كان raven-js يمكنه فعل الشيء نفسه.

dmcquay هل يمكنك تقديم مثال يرصده Errorception؟ ربما يمكنني عكس هندسة ذلك.

أفترض بالفعل أن جميع معالجات أخطاء JS هي 50٪ raven.js ؛)

:يتبرز:

BYK ، أي أفكار؟

ليس لدي أي معرفة داخلية عن الخطأ. أنا أستخدم الخدمة ويبدو أنها تعمل كما هو معلن عنها. هذا كل ما اعرفه.

لقد قمت بفحص كيفية عملهم ويبدو أنهم ببساطة يربطون أنفسهم بـ window.onerror ولا يهتمون بتتبع المكدس. على الأقل لهذا النوع من الأشياء.

يعمل Hijacking the Error object مع Firefox ولكن نقطة mattrobenolt حول التقاط كل منهم ، حتى تلك التي لم يتم طرحها هي مصدر قلق صحيح.

قد يكون الحل البديل لهذا هو تخزين مثيلات Error التي تم إنشاؤها عن طريق اختطاف المُنشئ العالمي والاستماع أيضًا إلى onerror ومقارنة message ، fileName و lineNo وسائط

أثناء تقييم جميع خدمات إعلام الأخطاء ، لاحظت أن بعض الخدمات الخاصة بجافا سكريبت (مثل https://qbaka.com/) تتعقب تتبع المكدس وتعرض إجراء المستخدم الذي أدى إلى خطأ معين. خطأ سيء للغاية لا يفعل ذلك لأنه يبدو متفوقًا من جميع النواحي.

سنستخدم Sentry لرمز Django الخاص بنا ، وقد عثرت على هذه المشكلة أثناء البحث عن معلومات حول كيفية عمل Sentry مع Javascript. هل يتطلب التنفيذ الحالي لـ raven-js الكود لالتقاط جميع أخطاء JS بوضوح وإبلاغ Sentry بها؟

@ adityar7 لا. يحاول Raven.js أنه من الأفضل تصحيح القرود واعتراض الأشياء إذا أمكن ذلك. في بعض الحالات الإضافية ، قد تحتاج إلى الالتفاف بشكل صريح ، لكننا نحاول جاهدًا أن نجعل الأشياء تحدث تلقائيًا.

mattrobenolt حصلت على العمل من خلال إصلاح بعض بناء الجملة. شكرا!

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