Frage

Wie Sie sehen können, auch nachdem das Programm gestorben soll es spricht aus dem Grab. Gibt es eine Möglichkeit, die exitfunction bei Ausnahmen „abzumelden“?

import atexit

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

atexit.register(helloworld)

raise Exception("Good bye cruel world!")

Ausgänge

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!
War es hilfreich?

Lösung

Ich weiß wirklich nicht, warum Sie das tun wollen, aber Sie können eine excepthook installieren, die von Python aufgerufen werden, sobald eine uncatched Ausnahme ausgelöst wird, und in klar die Anordnung der registrierten Funktion im atexit Modul.

So etwas:

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

Beachten Sie, dass es falsch verhalten kann, wenn die Ausnahme von einer atexit registrierte Funktion erhöht wird (aber dann wäre das Verhalten seltsam gewesen sein, auch wenn dieser Haken nicht verwendet wurde).

Andere Tipps

Wenn Sie anrufen

import os
os._exit(0)

die Ausfahrt Handler wird nicht aufgerufen, Ihre eigenen oder die von anderen Modulen in der Anwendung registriert.

Neben Aufruf os._exit () den registrierten Ausgang Transporteur zu vermeiden, müssen Sie auch die nicht behandelte Ausnahme fangen:

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top