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

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top