هل معالج الاستثناء على مستوى التطبيق منطقي؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

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

إذا تعطل تطبيقي، أريد التأكد من تحرير موارد النظام هذه بشكل صحيح.

هل يعقل أن تفعل شيئا مثل ما يلي؟

def main():
    # TODO: main application entry point
    pass

def cleanup():
    # TODO: release system resources here
    pass

if __name__ == "__main__":
    try:
        main()
    except:
        cleanup()
        raise

هل هذا شيء يتم القيام به عادةً؟هل هناك طريقة أفضل؟ربما المدمر في فئة مفردة؟

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

المحلول

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

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

فقط كن حذرًا من أن معالج المستوى الأعلى الخاص بك لا يطرح استثناءات!

نصائح أخرى

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

إذا لم تكن قلقًا حقًا، فاستخدم وحدة atexit.

معالج التطبيق الواسع جيد.إنها رائعة للتسجيل.فقط تأكد من أن التطبيق واسع النطاق متين ومن غير المرجح أن يتعطل بنفسه.

إذا كنت تستخدم الفئات، فيجب عليك تحرير الموارد التي تخصصها في أدوات التدمير الخاصة بها بدلاً من ذلك بالطبع.استخدم المحاولة:على التطبيق بأكمله فقط إذا كنت تريد تحرير الموارد التي لم يتم تحريرها بالفعل بواسطة أدوات تدمير فئاتك.

وبدلاً من استخدام خاصية التقاط الكل باستثناء:، يجب عليك استخدام الكتلة التالية:

try:
    main()
finally:
    cleanup()

سيضمن ذلك التنظيف بطريقة أكثر بيثونية.

يبدو هذا أسلوبًا معقولًا وأكثر وضوحًا وموثوقية من أداة التدمير في فئة مفردة.يمكنك أيضًا الاطلاع على "com.atexit" وحدة.(تُنطق "عند الخروج"، وليس "a tex it" أو شيء من هذا القبيل.لقد كنت في حيرة من أمري لفترة طويلة.)

فكر في كتابة مدير سياق واستخدام عبارة with.

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