Wie sys.exitfunc überspringen, wenn nicht behandelte Ausnahmen auftreten
Frage
Wie Sie sehen können, auch nachdem das Programm gestorben soll es spricht aus dem Grab. Gibt es eine Möglichkeit, die exitfunction bei Ausnahmen „abzumelden“?
import atexit
def helloworld():
print("Hello World!")
atexit.register(helloworld)
raise Exception("Good bye cruel world!")
Ausgänge
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!
Lösung
Ich weiß wirklich nicht, warum Sie das tun wollen, aber Sie können eine excepthook installieren, die von Python aufgerufen werden, sobald eine uncatched Ausnahme ausgelöst wird, und in klar die Anordnung der registrierten Funktion im atexit
Modul.
So etwas:
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!")
Beachten Sie, dass es falsch verhalten kann, wenn die Ausnahme von einer atexit
registrierte Funktion erhöht wird (aber dann wäre das Verhalten seltsam gewesen sein, auch wenn dieser Haken nicht verwendet wurde).
Andere Tipps
Wenn Sie anrufen
import os
os._exit(0)
die Ausfahrt Handler wird nicht aufgerufen, Ihre eigenen oder die von anderen Modulen in der Anwendung registriert.
Neben Aufruf os._exit () den registrierten Ausgang Transporteur zu vermeiden, müssen Sie auch die nicht behandelte Ausnahme fangen:
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)