كيفية تخطي sys.exitfunc عند حدوث استثناءات غير معالجة
سؤال
كما ترون، حتى بعد أن يموت البرنامج فإنه يتحدث من القبر.هل هناك طريقة "لإلغاء تسجيل" وظيفة الخروج في حالة وجود استثناءات؟
import atexit
def helloworld():
print("Hello World!")
atexit.register(helloworld)
raise Exception("Good bye cruel world!")
النواتج
Traceback (most recent call last):
File "test.py", line 8, in <module>
raise Exception("Good bye cruel world!")
Exception: Good bye cruel world!
Hello World!
المحلول
لا أعرف حقًا سبب رغبتك في القيام بذلك، ولكن يمكنك تثبيت خطاف استثناء سيتم استدعاؤه بواسطة Python عند ظهور استثناء غير مُكتشف، وفيه مسح مجموعة الوظائف المسجلة في atexit
وحدة.
شئ مثل هذا :
import sys
import atexit
def clear_atexit_excepthook(exctype, value, traceback):
atexit._exithandlers[:] = []
sys.__excepthook__(exctype, value, traceback)
def helloworld():
print "Hello world!"
sys.excepthook = clear_atexit_excepthook
atexit.register(helloworld)
raise Exception("Good bye cruel world!")
احذر من أنه قد يتصرف بشكل غير صحيح إذا تم رفع الاستثناء من ملف atexit
وظيفة مسجلة (ولكن بعد ذلك كان السلوك غريبًا حتى لو لم يتم استخدام هذا الخطاف).
نصائح أخرى
إذا اتصلت
import os
os._exit(0)
لن يتم استدعاء معالجات الخروج، سواء الخاصة بك أو تلك المسجلة بواسطة وحدات أخرى في التطبيق.
بالإضافة إلى استدعاء os._exit() لتجنب معالج الخروج المسجل، تحتاج أيضًا إلى اكتشاف الاستثناء غير المعالج:
import atexit
import os
def helloworld():
print "Hello World!"
atexit.register(helloworld)
try:
raise Exception("Good bye cruel world!")
except Exception, e:
print 'caught unhandled exception', str(e)
os._exit(1)
لا تنتمي إلى StackOverflow