Warum Python ' s urllib2.urlopen() wirft eine HTTPError für die erfolgreiche status-codes?
Laut die urllib2 Dokumentation,
Weil die Standard-Handler mit Weiterleitungen umgehen (codes in der 300-Reihe), und codes, die in der 100-299 Angebot zeigen Erfolg, Sie werden in der Regel nur siehe Fehler-codes in der 400-599 Bereich.
Und noch den folgenden code
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
wirft ein HTTPError mit code 201 (created):
ERROR 2011-08-11 20:40:17,318 __init__.py:463] HTTP Error 201: Created
Also, warum ist urllib2
werfen HTTPErrors auf diesem erfolgreichen Antrag?
Es ist nicht zu viel von einem Schmerz, ich kann einfach verlängern Sie den code:
try:
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
except HTTPError, e:
if e.code == 201:
# success! :)
else:
# fail! :(
else:
# when will this happen...?
Aber dieses scheint nicht, wie das beabsichtigte Verhalten, basierend auf der Dokumentation und die Tatsache, dass ich kann nicht finden, ähnliche Fragen über dieses sonderbare Verhalten.
Auch, was soll das else
block erwarten? Wenn erfolgreich status codes werden alle interpretiert als HTTPError
s, wenn dann tut urllib2.urlopen()
einfach nur wieder eine normale Datei ist-wie response-Objekt wie alle urllib2
Dokumentation bezieht sich auf?
- Es ist wirklich ungewöhnlich, um zu sehen, Reaktion-codes zwischen 201-299. Nicht überrascht urllib2 nicht Umgang mit Ihnen perfekt.
- Bin ich etwas fehlt? 201 funktioniert gut für mich...
- vielleicht bist du mit einem nicht-standard-handler pro dcrosta Antwort?
- Es ist tatsächlich nicht. Schauen Sie sich den aktuellen urllib2.py Quelle in Python27\Lib, Linien 511-3.
- Nein, ich verwendet Vanille mit urllib2 keine änderung.
- hm, sehr seltsam. Ich habe versucht, dies in Python 2.7 und du hast Recht, es funktioniert gut. Ich war mit Python 2.5, so dass Sie wahrscheinlich gab es eine saner Standard für 2.7.
- Die endgültige
else
- Anweisung wird ausgeführt, wenn dertry
- block erfolgreich ausgeführt wird - Sie können es hier Lesenif exception: else:
wenn das hilft. - ja, ich bin mir dessen bewusst. Ich fragte den
else
blockieren, weil es schien, wie jeder mögliche status-code war ein Geschmack von HTTPError, so dass ich nicht verstehe, wenn dietry
block würde jemals erfolgreich ausgeführt. Anscheinend war es nur für 200s.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als die eigentliche Bibliothek Dokumentation erwähnt:
http://docs.python.org/library/urllib2.html#httperrorprocessor-objects
Schreiben Sie eine benutzerdefinierte
Handler
Klasse für die Verwendung miturllib2
zu verhindern, dass bestimmte Fehler-codes ausgelöst wird, wieHTTError
. Hier ist eine, die ich vorher schon benutzt haben:Dann können Sie es verwenden, wie:
Ich persönlich denke, dass es ein Fehler war und sehr nonintuitive dies das Standardverhalten.
Es ist wahr, dass nicht-2XX-codes bedeuten, eine Protokoll-Ebene Fehler, aber drehen, die in eine Ausnahme ist zu weit (meiner Meinung nach zumindest).
In jedem Fall, ich denke, der eleganteste Weg, dies zu vermeiden ist:
Jetzt haben Sie das response-Objekt. Sie können überprüfen Sie den status-code, Header, body, etc.