2013-03-25 8 views
31

Beim Debuggen von Python-Code an der interaktiven Eingabeaufforderung (REPL), schreibe ich oft Code, der eine Ausnahme auslöst, aber ich habe es nicht in eine try/except verpackt, so sobald ich den Fehler ausgelöst habe, habe ich für immer verloren das Ausnahmeobjekt.Wie erhält man das letzte Ausnahmeobjekt, nachdem bei einer Python-Eingabeaufforderung ein Fehler aufgetreten ist?

Oft ist die Rückverfolgung und die Fehlermeldung, die Python ausgibt, nicht genug. Wenn Sie beispielsweise eine URL abrufen, gibt der Server möglicherweise einen Fehler 40x zurück, und Sie benötigen den Inhalt der Antwort über error.read() ... aber Sie haben das Fehlerobjekt nicht mehr. Zum Beispiel:

>>> import urllib2 
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    ... 
urllib2.HTTPError: HTTP Error 400: Bad Request 

Drat, was hat der Körper der Antwort gesagt? Es hatte wahrscheinlich wertvolle Fehlerinformationen darin ...

Ich weiß, es ist in der Regel einfach, Ihren Code in einem try/excepted-Code neu zu implementieren, aber das ist nicht ideal. Ich weiß auch, dass ich in diesem speziellen Fall, wenn ich die requests-Bibliothek verwenden würde (die für HTTP-Fehler nicht erhöht), würde ich nicht dieses Problem haben ... aber ich frage mich wirklich, ob es einen allgemeineren Weg zu bekommen gibt das letzte Ausnahmeobjekt an einer Python-Eingabeaufforderung in diesen Fällen.

Antwort

44

Das Modul sys bietet einige Funktionen zur nachträglichen Prüfung von Ausnahmen: sys.last_type, sys.last_value und sys.last_traceback.

sys.last_value ist derjenige, den Sie suchen.

+1

Sehr schön, danke! Funktioniert wie dokumentiert. Seltsam, dass meine Google-Suche das nicht gefunden hat, aber naja. (Obwohl ich ein recht erfahrener Python - Entwickler bin, lerne ich jeden Tag etwas über Python oder seine Standardbibliotheken ...) –

+0

@BenHoyt FYI, nach der Dokumentation von 'sys'," Diese drei sind nur in einer interaktiven Sitzung nach einem Traceback wurde gedruckt. ". – satoru

+1

@satoru Nun, offensichtlich. In einem normalen Programm wird eine unbehandelte Ausnahme das Programm beenden. – Cairnarvon

4

Als @Cairnarvon erwähnt, habe ich keine last_value Mitglied finden ist sys-Modul.

sys.exc_info() hat den Trick für mich getan. sys.exc_info() gibt ein Tupel mit drei Werten (type, value, traceback) zurück.

So sys.exc_info()[1] wird den lesbaren Fehler geben. Hier ist das Beispiel

import sys 
list = [1,2,3,4] 
try: 
    del list[8] 
except Exception: 
    print(sys.exc_info()[1]) 

ausgeben werden list assignment index out of range

Auch traceback.format_exc() von traceback Modul verwendet werden kann, aus den ähnlichen Informationen zu drucken.

Unterhalb der ausgegeben wird, wenn fortmat_exec() verwendet wird,

Traceback (most recent call last): File "python", line 6, in <module> IndexError: list assignment index out of range