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.
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 ...) –
@BenHoyt FYI, nach der Dokumentation von 'sys'," Diese drei sind nur in einer interaktiven Sitzung nach einem Traceback wurde gedruckt. ". – satoru
@satoru Nun, offensichtlich. In einem normalen Programm wird eine unbehandelte Ausnahme das Programm beenden. – Cairnarvon