Como ignorar sys.exitfunc quando ocorrem exceções sem tratamento
Pergunta
Como você pode ver, mesmo depois que o programa deve ter morrido ele fala do sepulcro.Existe uma maneira para "remover" o exitfunction em caso de exceções?
import atexit
def helloworld():
print("Hello World!")
atexit.register(helloworld)
raise Exception("Good bye cruel world!")
saídas
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!
Solução
Eu realmente não sei por que você quer fazer isso, mas você pode instalar uma excepthook que será chamado pelo Python sempre que um uncatched exceção é levantada, e na clara a matriz da função registada no atexit
módulo.
Algo assim :
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!")
Cuidado que ele pode se comportar incorretamente se a exceção é gerada a partir de uma atexit
registrado função (mas, então, o comportamento teria sido estranho, mesmo se esta rotina não foi utilizado).
Outras dicas
Se você chamar
import os
os._exit(0)
a saída de manipuladores de não ser chamado, o seu, ou aqueles registrados por outros módulos da aplicação.
Além de chamar os._exit() para evitar que o registrado sair processador você também precisa pegar a exceção não tratada:
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)