Comment ignorer sys.exitfunc lorsque des exceptions non gérées se produisent
Question
Comme vous pouvez le constater, même après la mort du programme, il parle de la tombe. Existe-t-il un moyen de "désenregistrer"? la fonction de sortie en cas d'exception?
import atexit
def helloworld():
print("Hello World!")
atexit.register(helloworld)
raise Exception("Good bye cruel world!")
sorties
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!
La solution
Je ne sais pas vraiment pourquoi vous voulez faire cela, mais vous pouvez installer un excepthook qui sera appelé par Python chaque fois qu'une exception non appariée est levée, et efface le tableau des fonctions enregistrées dans le code .
module.
Quelque chose comme ça:
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!")
Attention, le comportement peut être incorrect si l'exception est générée à partir d'une fonction enregistrée atexit
(le comportement aurait alors été étrange même si ce hook n'avait pas été utilisé).
Autres conseils
Si vous appelez
import os
os._exit(0)
les gestionnaires de sortie ne seront pas appelés, ni les vôtres ni ceux enregistrés par d'autres modules de l'application.
En plus d'appeler os._exit () pour éviter le gestionnaire de sortie enregistré, vous devez également intercepter l'exception non gérée:
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)