أحداث بلا مسارات استدعاء: استرجع الإطارات
تصل الأخطاء إلى AllStak كرسائل مجردة بلا إطارات تساعدك على التصحيح. والسبب غالبًا في طريقة رمي الخطأ أو التقاطه.
كيف تبدو المشكلة
يعرض الحدث رسالة — "checkout failed" أو "undefined is not a function" — لكن بلا إطارات استدعاء تحتها. لا تستطيع معرفة الملف أو الدالة أو السطر الذي أنتج الخطأ، فيصبح التجميع خشنًا والتصحيح بطيئًا.
لا يوجد مسار استدعاء إلا عندما يصل كائن استثناء فعلي إلى الـ SDK. فالرسائل المسجّلة كنصوص، والقيم المرمية التي ليست كائنات Error، والالتقاطات التي تمرّر نصًا بدل الاستثناء — كلها تصل بلا مسار، إذ لا يستطيع الـ SDK إعادة بناء إطارات لم يستلمها أصلًا.
الأسباب الجذرية الشائعة
رمي قيم ليست Error في JavaScript
throw 'payment failed' أو throw { code: 500 } لا يحمل أي مسار. فقط نسخ Error (وفروعها) تلتقط مكدس الاستدعاء لحظة الإنشاء.
التقاط رسائل بدل استثناءات
captureMessage('it broke') مخصص للأحداث الإعلامية وبلا مسار بحكم تصميمه. داخل كتلة catch، مرّر الاستثناء الملتقط نفسه إلى captureException.
بوّابات الالتقاط معطّلة
تكاملات الـ SDK ذات بوّابات التقاط الاستثناءات (مثل allstak.capture-exceptions في مُشغّل Spring Boot) تتوقف عن الالتقاط التلقائي عند تعطيلها، فلا يبقى إلا ما تسجّله يدويًا.
إطارات متصفح مصغّرة بلا خرائط مصدر
في تطبيقات المتصفح قد يوجد المسار لكنه غير مقروء — سطر مصغّر واحد بأسماء مشوّهة. هذه مشكلة خرائط مصدر لا مشكلة التقاط؛ راجع صفحة استكشاف أخطاء خرائط المصدر.
التشخيص خطوة بخطوة
حدّد أين يضيع المسار: عند نقطة الرمي، أو نداء الالتقاط، أو العرض.
- 1
افحص كيفية رمي الخطأ
اعثر على مسار الشيفرة الذي أنتج الحدث بلا مسار. في JavaScript، استبدل throw 'msg' والكائنات العادية المرمية بـ throw new Error('msg') — فقط نسخ Error تحمل المكدس.
- 2
مرّر كائن الاستثناء إلى captureException
في كتل catch، نادِ captureException(error) بالكائن الملتقط — لا captureMessage بنص مبني منه. يستخرج الـ SDK الإطارات من الاستثناء نفسه.
- 3
افحص بوّابات الالتقاط في الـ SDK
راجع إعداد الـ SDK مقابل دليل إعداده: خيارات التقاط الاستثناءات مفعّلة افتراضيًا (مثل allstak.capture-exceptions=true في Spring Boot و attachErrorHandler في Vue) — وتأكد ألا شيء عطّلها.
- 4
فرّق بين غير المقروء والمفقود
إذا كانت أحداث المتصفح تعرض إطارًا مصغّرًا طويلًا واحدًا لا غياب إطارات، فالمسار الُتقط سليمًا — وتحتاج رفع خرائط مصدر لإصدار الحدث. اتبع صفحة استكشاف أخطاء خرائط المصدر لهذا المسار.
- 5
ارمِ خطأ اختبار محكومًا
أضف نقطة نهاية أو زرًا مؤقتًا يرمي new Error('allstak trace test') عبر مسار الشيفرة نفسه، وتأكد من وصول الحدث بإطارات كاملة. هذا يعزل الالتقاط عن منطق تطبيقك.
كيف تمنع تكرارها
- اعتمد قاعدة lint (مثل no-throw-literal) حتى لا تُرمى إلا كائنات Error.
- وحّد الاستخدام: captureException للأعطال و captureMessage للأحداث الإعلامية فقط.
- أبقِ بوّابات التقاط الاستثناءات على افتراضها (مفعّلة) إلا لسبب موثّق.
- لتطبيقات المتصفح، ارفع خرائط المصدر لكل إصدار لتبقى المسارات الملتقطة مقروءة.
ما زلت عالقًا؟
إذا كانت كائنات Error حقيقية تصل إلى captureException والأحداث ما زالت تصل بلا مسار، راسلنا على [email protected] باسم الـ SDK ونسخته ومقتطف شيفرة لموضع الالتقاط ورابط حدث متأثر — وسلوك الالتقاط لكل لغة موثّق في دليل إعداد كل SDK.
الأسئلة الشائعة
ليش captureMessage ما يتضمن مسار استدعاء؟
بحكم التصميم — يسجّل captureMessage حدثًا إعلاميًا لا استثناء. وعندما يكون لديك كائن استثناء، مرّره إلى captureException حتى تسافر إطاراته مع الحدث.
أشوف إطارًا مصغّرًا واحدًا — هل هذا مسار مفقود؟
لا، هذا مسار ملتقط لكنه غير مقروء. ارفع خرائط المصدر للإصدار المطابق الذي يرسله الـ SDK وستُحلّ الأحداث الجديدة إلى الملفات والأسطر الأصلية.
هل تفقد الأخطاء غير المتزامنة مساراتها؟
كائن Error المُنشأ داخل شيفرة غير متزامنة ما زال يحمل المكدس من نقطة إنشائه. وتضيع المسارات عندما تحوّل الشيفرة الخطأ إلى نص (مثل تسجيل error.message) قبل الالتقاط — مرّر الكائن نفسه دائمًا.
استكشف المزيد
صحّح من السطر بالضبط
التقط استثناءات حقيقية بإطارات كاملة، وحُلّها بخرائط المصدر، وجمّعها لكل إصدار — في منصّة واحدة. ابدأ مجانًا.