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 HTTPErrors, 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 der try - block erfolgreich ausgeführt wird - Sie können es hier Lesen if 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 die try block würde jemals erfolgreich ausgeführt. Anscheinend war es nur für 200s.

InformationsquelleAutor rubergly | 2011-08-11
Schreibe einen Kommentar