Try/außer bei der Verwendung von Python-requests-Modul
Tun einige API testen und versuchen, zu erstellen eine Funktion, die, gegeben eine eingegeben URL wird zurückgegeben, der json-Antwort, aber wenn ein HTTP-Fehler ist, ist die Antwort eine Fehlermeldung zurückgegeben wird.
War ich mit urllib2 vor, aber jetzt versucht die Anfragen statt. Aber es sieht aus wie meiner, außer block wird nie ausgeführt, unabhängig von dem Fehler.
testURL = 'http://httpbin.org/status/404'
def return_json(URL):
try:
response = requests.get(URL)
json_obj = response.json()
return json_obj
except requests.exceptions.HTTPError as e:
return "Error: " + str(e)
Das Ergebnis bekomme ich bei der Ausführung der oben...
<Response [404]>
Was genau ist ein HTTP-Fehler? Es gibt status-codes, aber nicht alles andere als
Danke Lukas, ich denke, für meinen Fall etwas anderes als 200 sein sollte als Fehler betrachtet.
200
unbedingt bedeutet, dass es ein Fehler irgendeiner Art ist. Als Sie bemerkte, das request
Bibliothek hält diese nur ein weiterer Aspekt einer HTTP-response und nicht zu einer Ausnahme. So müssten Sie ein bisschen mehr spezifisch über das, was ist ein "Fehler" für Ihren Fall.Danke Lukas, ich denke, für meinen Fall etwas anderes als 200 sein sollte als Fehler betrachtet.
InformationsquelleAutor mroriel | 2014-07-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass die Reaktion auf das auslösen einer Ausnahme für einen nicht-200-status-code verwenden
response.raise_for_status()
. Dein code würde dann so Aussehen:Kann man sagen, dass diese deutlich einfacher als die anderen Lösungen hier und nicht erforderlich, dass Sie überprüfen Sie den status code manuell eingeben. Sie würde auch einfach fangen ein
HTTPError
da, dass ist das, wasraise_for_status
erhöhen wird. FangRequestsException
ist eine schlechte Idee. Dass fangen werden Dinge wieConnectionError
s oderTimeoutError
s, etc. Keiner von denen, die das gleiche bedeuten wie das, was Sie versuchen zu fangen.InformationsquelleAutor Ian Stapleton Cordasco
Hinweis: obwohl dies der akzeptierte Antwort, Sie sollten lieber gehen mit
response.raise_for_status()
wie beschrieben in Ian ' s Antwort unten (er ist einer der Betreuer derrequests
Modul).Wie handhabt Ihr das hängt alles davon ab, was Sie als ein HTTP-Fehler. Es gibt status-codes, aber nicht alles andere als
200
unbedingt bedeutet, dass es ein Fehler irgendeiner Art ist.Als Sie bemerkte, das verlangen Bibliothek hält diese nur ein weiterer Aspekt einer HTTP-response und nicht zu einer Ausnahme. HTTP-status
302
zum Beispiel bedeutetFound
, aber die Antwort nicht enthalten, eine Antwort Körper, sondern eineLocation
header anstelle, dass Sie brauchen, um zu bekommen, um die Ressource, die Sie eigentlich wollte.So dass Sie wollen, zu betrachten
Antwort.status_code
und die Handhabung von, dass, während fangen die tatsächliche - Protokoll-Fehler mit einemtry..except
. Wenn man diese sollte man eigentlich fangenrequests.exceptions.RequestException
, denn dies ist die Basisklasse für alle anderen Ausnahmen dierequests
Modul wirft.So, hier ist ein Beispiel, das zeigt alle drei Fälle:
200 OK
Antwort200
Ausgabe:
Könnte es auch eine Ausnahme ausgelöst durch
response.json()
wenn Sie eine erfolgreiche Antwort, aber es ist einfach nicht die JSON - so möchten Sie vielleicht zu berücksichtigen, dass, wie gut.Hinweis: Die
if not response.status_code //100 == 2
bit funktioniert wie folgt:Die
//
operator stellt eine so genannte floor division, so es rundet ab auf die nächste Ganzzahl (dies ist das Standardverhalten für die/
in Python 2.x, aber nicht Python 3.x, die sich/
zu tun Fließkomma-division). Sostatus //100 == 2
gilt für alle2xx
codes.Guter Punkt, auch über die nicht-JSON erfolgreiche Antwort. Ich werde in diesem Blick.
die
int(response.status_code / 100) == 2
bereits Konten für2xx
; -), Auf Python 2.x die division/
Betreiber übernimmt Etage division (abgerundet auf die nächste ganze Zahl), sostatus / 100 == 2
gilt für alle2xx
codes. Auf Python 3.x die division wurde geändert, um floating-point-division, das ist, warum dieint(...)
benötigt wird, um es Arbeit für Python 2.x sowie 3.x.Ahh okay, es ist meine Unerfahrenheit zum Vorschein! Tausend Dank für Eure Hilfe Lukas, das funktioniert perfekt.
eigentlich ist der saubere Weg dies zu tun Fußboden-division in Python 2.x sowie 3.x ist die Verwendung der
//
Betreiber - aktualisiert meine Antwort und erklärte, dass bit.InformationsquelleAutor Lukas Graf
Können Sie die
response.status_code
Wert. Wenn es nicht200
, dann können Sie halte es für einen Fehler und werfen Sie Ihre eigene Ausnahme.Whups. Du hast Recht, @PadraicCunningham. Vielen Dank, fixieren Sie es jetzt.
keine sorgen einfache Fehler
Danke Jungs, das funktioniert. Hinzugefügt eine if-Anweisung, um die Reaktion zu überprüfen. Aber dieser verzichtet auf die Verwendung von Try/Except.
InformationsquelleAutor austin