ملتوية: لا يوجد تتبع استثناء إذا كان خطأ من رد الاتصال

StackOverflow https://stackoverflow.com/questions/3826233

سؤال

النظر في الرمز التالي:

df = defer.Deferred()
def hah(_): raise ValueError("4")
df.addCallback(hah)
df.callback(hah)

عندما يتم تشغيله ، يتم تناول هذا الاستثناء. اين ذهبت؟ كيف يمكنني الحصول عليها لعرضها؟ عمل defer.setDebugging(True) ليس له أي تأثير.

أسأل هذا لأنه في أوقات أخرى ، أحصل على نسخة مطبوعة تقول "خطأ غير معبأ في مؤجل:". كيف أحصل على ذلك في هذه الحالة؟ أرى أنه إذا قمت بإضافة خطأ إلى df ثم يتم استدعاء Errback باستثناء ، لكن كل ما أريد فعله هو طباعة الخطأ ولا أفعل شيئًا آخر ، ولا أريد إضافة هذا المعالج يدويًا إلى كل مؤجل أقوم بإنشائه.

هل كانت مفيدة؟

المحلول

الاستثناء لا يزال يجلس في المؤجل. هناك نتيجتان محتملتان في هذه المرحلة:

  • يمكنك إضافة خطأ إلى المؤجل. بمجرد أن تفعل ذلك ، سيتم استدعاؤه بفشل يحتوي على استثناء تم رفعه.
  • يمكن أن تدع المؤجل يتم جمع القمامة (حذف صراحة df, أو العودة من الوظيفة ، أو تفقد المرجع بأي طريقة أخرى). هذا يؤدي إلى "الخطأ غير المعقول في مؤجل".

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

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

هذا لا يجب أن يكون عبئا فظيعا. أي مؤجل (أ) يتم إرجاعه من رد اتصال على آخر مؤجل (ب) (أي ، عند حدوث التسلسل) سوف يمر بأخطائه إلى ب. لذلك (أ) لا يحتاج إلى إخطارات إضافية على تسجيلها وإعداد التقارير ، فقط (ب) لا. إذا كان لديك مهمة منطقية واحدة معقدة وتتضمن العديد من العمليات غير المتزامنة ، فمن الممكن دائمًا تقريبًا أن جميع المؤجلات المشاركة في تلك العمليات يجب أن تقوم بتوجيه نتائجها (النجاح أو الفشل) إلى مؤجل رئيسي واحد يمثل العملية المنطقية. غالبًا ما تحتاج فقط إلى سلوك معالجة أخطاء خاصة على ذلك المؤجل ، وسيتيح لك ذلك التعامل مع الأخطاء من أي من المؤجلات الأخرى المعنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top