Cómo saltar sys.exitfunc cuando las excepciones no controladas que producen
Pregunta
Como se puede ver, incluso después de que el programa debería haber muerto que habla desde la tumba.Es allí una manera de "darse de baja" de la exitfunction en el caso de las excepciones?
import atexit
def helloworld():
print("Hello World!")
atexit.register(helloworld)
raise Exception("Good bye cruel world!")
salidas
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!
Solución
Realmente no sé por qué quieres hacer eso, pero se puede instalar un excepthook que será llamado por Python siempre que un uncatched excepción, y en claro la matriz de la función registrada en el atexit
el módulo.
Algo así como que :
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!")
Ten en cuenta que puede comportarse incorrectamente si la excepción se produce a partir de un atexit
la función registrada (pero entonces, el comportamiento habría sido extraño incluso si este enlace no se utilizó).
Otros consejos
Si usted llame
import os
os._exit(0)
la salida de los controladores de no ser llamado, el tuyo o el de los registrados por otros módulos de la aplicación.
Además de llamar a os._exit() para evitar que el registrado la salida de controlador también se necesita para la captura de la excepción no controlada:
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)