84 Stimmen

Wie fange ich einen bestimmten HTTP-Fehler in Python ab?

Ich habe

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError:

aber was ich am Ende habe, ist das Fangen aller Arten von HTTP-Fehlern. Ich möchte nur fangen, wenn die angegebene Webseite nicht vorhanden ist (404?).

145voto

Tim Pietzcker Punkte 311448

Python 3

from urllib.error import HTTPError

Python 2

from urllib2 import HTTPError

Nur HTTPError abfangen, behandeln und wenn es kein Fehler 404 ist, einfach raise verwenden, um die Ausnahme erneut auszulösen.

Siehe das Python Tutorial.

Hier ist ein vollständiges Beispiel für Python 2:

import urllib2
from urllib2 import HTTPError
try:
   urllib2.urlopen("some url")
except HTTPError as err:
   if err.code == 404:

   else:
       raise

45voto

Lazik Punkte 2310

Für Python 3.x

import urllib.request
import urllib.error
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)

5voto

sonavolob Punkte 334

Tim's Antwort erscheint mir irreführend, besonders wenn urllib2 nicht den erwarteten Code zurückgibt. Zum Beispiel wird dieser Fehler schwerwiegend sein (glauben Sie es oder nicht - es ist kein ungewöhnlicher, wenn URLs heruntergeladen werden):

AttributeError: 'URLError' Objekt hat kein Attribut 'code'

Schnell, aber vielleicht nicht die beste Lösung wäre es, Code mit verschachtelten Try/Except-Blöcken zu verwenden:

import urllib2
try:
    urllib2.urlopen("eine url")
except urllib2.HTTPError as err:
    try:
        if err.code == 404:
            # Fehler behandeln
        else:
            raise
    except:
        ...

Mehr Informationen zum Thema verschachtelte Try/Except-Blöcke Sind verschachtelte Try/Except-Blöcke in Python eine gute Programmierpraxis?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X