كيفية تخطي sys.exitfunc عند حدوث استثناءات غير معالجة

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

  •  09-06-2019
  •  | 
  •  

سؤال

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

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top