2010-07-07 9 views
54

ich einen bestimmten http Fehler fangen wollen, und nicht irgendeine der ganzen Familie .. was ich versucht habe zu tun ist -fangen spezifische HTTP-Fehler in Python

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

aber was ich am Ende ist jede Art von HTTP-Fehler abfangen, aber ich möchte nur fangen, wenn die angegebene Webseite nicht existiert !! Wahrscheinlich ist das der HTTP-Fehler 404..aber ich weiß nicht, wie ich den Fehler 404 festlegen und das System den Standard-Handler für andere Ereignisse ausführen lassen soll.

+0

Haben Sie das Rezept in diesem Beitrag versucht? http://stackoverflow.com/questions/1308542/how-to-catch-404-error-in-urllib-urlretrieve –

Antwort

91

Nur fangen urllib2.HTTPError, handle es, und wenn es nicht Error 404 ist, einfach raise verwenden, um die Ausnahme erneut auszulösen.

Siehe die Python tutorial.

So könnten Sie tun:

import urllib2 
try: 
    urllib2.urlopen("some url") 
except urllib2.HTTPError as err: 
    if err.code == 404: 
     <whatever> 
    else: 
     raise 
+0

hey !! das funktioniert wie Charme !! Ich habe nicht an den "Raise" -Trick gedacht !! Vielen Dank !! –

+0

Kann ich urllib2.urlopen ("*") verwenden, um 404-Fehler zu behandeln und sie an meine 404.html-Seite weiterzuleiten? –

25

Für Python 3.x

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

Mit 'except urllib.error.HTTPError as err:' ohne Import-Befehls-Fixes 'ist das Abfangen von Klassen, die nicht von BaseException erben, nicht erlaubt. – Abhijeet

3

Tims Antwort auf mich als irreführend zu sein scheint. Vor allem, wenn urllib2 den erwarteten Code nicht zurückgibt. Zum Beispiel wird dieser Fehler tödlich sein (glauben oder nicht - es ist ein nicht selten beim Herunterladen Urls):

AttributeError: 'URLError' object has no attribute 'code'

Schnell, aber vielleicht nicht die beste Lösung Code mit verschachtelten try/except Block würde:

import urllib2 
try: 
    urllib2.urlopen("some url") 
except urllib2.HTTPError, err: 
    try: 
     if err.code == 404: 
      # Handle the error 
     else: 
      raise 
    except: 
     ... 

Weitere Informationen zum Thema von verschachtelter try/except Blöcken Are nested try/except blocks in python a good programming practice?