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!
Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top