Как видите, даже после того, как программа должна была умереть, она говорит из могилы. Есть ли способ «отменить регистрацию» функции выхода в случае исключений?
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!






Если вы позвоните
import os
os._exit(0)
обработчики выхода не будут вызываться, ни ваши, ни зарегистрированные другими модулями приложения.
Я действительно не знаю, почему вы хотите это сделать, но вы можете установить excepthook, который будет вызываться 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 (но тогда поведение было бы странным, даже если бы этот перехватчик не использовался).
В дополнение к вызову 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)