Как пропустить 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)