Domanda

Come puoi vedere, anche dopo che il programma avrebbe dovuto morire, parla dalla tomba.Esiste un modo per "annullare la registrazione" della funzione di uscita in caso di eccezioni?

import atexit

def helloworld():
    print("Hello World!")

atexit.register(helloworld)

raise Exception("Good bye cruel world!")

uscite

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!
È stato utile?

Soluzione

Non so davvero perché tu voglia farlo, ma puoi installare un extracthook che verrà chiamato da Python ogni volta che viene sollevata un'eccezione non catturata, e in esso cancella l'array della funzione registrata nel atexit modulo.

Qualcosa del genere :

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!")

Fai attenzione perché potrebbe comportarsi in modo errato se l'eccezione viene sollevata da un file atexit funzione registrata (ma il comportamento sarebbe stato strano anche se questo hook non fosse stato utilizzato).

Altri suggerimenti

Se chiami

import os
os._exit(0)

non verranno chiamati i gestori dell'uscita, né i tuoi né quelli registrati da altri moduli dell'applicazione.

Oltre a chiamare os._exit() per evitare il gestore di uscita registrato, devi anche catturare l'eccezione non gestita:

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top