2016-07-31 8 views
4

Ich muss eine atexit Python-Funktion implementieren, die das letzte Fehlerobjekt erhalten und auf seinen Typ prüfen würde. Wenn der Typ des Python-Fehlers mit E_ERROR von PHP übereinstimmt, sollte ich die Ausgabe des Fehlers in einer Datei speichern.Was ist Python Ersatz für PHP error_get_last() Funktion?

Der PHP-Code I sieht aus wie so bin Portierung:

register_shutdown_function("fatal_handler"); 
function fatal_handler() { 
    $error = error_get_last(); 
    if ($error != null && $error['type'] === E_ERROR) 
     echo "recordFatalError: {$error['message']}\n"; 
} 

Mein Code Snap sind wie folgt:

def fatal_handler(): 
    # How to get last error object? 

atexit.register(fatal_handler) 

ich froh wäre, wenn jemand mir erklären, wie kann ich die notwendige bekommen Funktionalität mit Python.

Antwort

2

würde ich sys.last_value für diesen Einsatz:

import atexit 
import sys 

def fatal_handler(): 
    try: 
     e = sys.last_value 
    except AttributeError: # no exception prior to execution of fatal_handler 
     return 

atexit.register(fatal_handler) 

Sie können wählen getattr(sys, 'last_value', None) anstelle der EAFP approach oben zu verwenden. Es gibt None zurück, wenn sys.last_value nicht verfügbar ist.

Alternativ kann, wenn es nur eine Funktion ist nur ausgeführt werden soll, wenn der Dolmetscher Abschaltung durch eine Ausnahme verursacht wird, könnten Sie sys.excepthook verwenden:

import sys 

def fatal_handler(type, value, traceback): 
    e = value 

sys.excepthook = fatal_handler 
+0

Das Problem bei diesem Ansatz ist, dass 'sys.last_value' kann nur referenziert werden, wenn der Fehler passiert ist, während es mit' atexit' Funktion nicht immer wahr. Außerdem brauche ich auch einen Typ der Ausnahme nicht nur den Wert ('sys.last_type'). – ddnomad

+0

@ddnomad ist es trivial, den Typ eines Objekts zu finden, z.B. mit 'type'. Es ist auch 'sys.last_type' verfügbar. – vaultah

+0

Ich interessiere mich für andere mögliche Wege zu vermeiden, "try/except" Blöcke zu überprüfen, dass diese Werte vorhanden sind. – ddnomad

1

Wenn eine Ausnahme ausgelöst wird und nicht abgefangene, der Dolmetscher ruft sys.excepthook mit Informationen über die Ausnahme. Die Standardfunktion gibt eine bestimmte Rückverfolgung und Ausnahme für sys.stderr aus. Sie können diese Funktion durch eine Funktion ersetzen, die diese Daten speichert. Später können Sie diese Daten in Ihrem atexit Handler:

import atexit 
import sys 

class LastException: 
    value  = None 
    type  = None 
    trackback = None 

    @staticmethod 
    def excepthook(type,value,trackback): 
     LastException.type  = type 
     LastException.value  = value 
     LastException.trackback = trackback 

    @staticmethod 
    def register(): 
     sys.excepthook = LastException.excepthook 

def fatal_handler(): 
    print('{0} {1}'.format(LastException.type, LastException.value)) 

LastException.register() 
atexit.register(fatal_handler) 

raise BaseException("I am an error") 
# should print: <class 'BaseException'> I am an error 
Verwandte Themen