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!
Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top