2010-07-07 13 views
54

chcę złapać konkretny błąd HTTP i nie któregokolwiek z całej rodziny .. co starałem się zrobić to -haczyk w Pythonie

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

ale co mi się skończyć przechwytywanie wszelkiego rodzaju błędów http, ale chcę złapać tylko wtedy, gdy podana strona nie istnieje !! prawdopodobnie to błąd HTTP 404 .. ale nie wiem jak określić błąd tylko catch 404 i pozwolić systemowi uruchomić domyślny handler dla innych zdarzeń..ne sugestie ??

+0

próbowałem przepis w tym poście? http://stackoverflow.com/questions/1308542/how-to-catch-404-error-in-urllib-urlretrieve –

Odpowiedz

91

Po prostu złap, zrób to, a jeśli to nie jest błąd 404, po prostu użyj raise, aby ponownie podnieść wyjątek.

Zobacz Python tutorial.

Więc można zrobić:

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

hej !! to działa jak urok !! Nie myślałem o sztuczce "podbijanie", dziękuję bardzo! –

+0

czy mogę zrobić urllib2.urlopen ("*"), aby obsłużyć błędy 404 i przekierować je na moją stronę 404.html? –

25

dla Pythona 3.x

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

Użycie 'except urllib.error.HTTPError jako err:' bez użycia poleceń importowania poleceń 'łapanie klas, które nie dziedziczą po BaseException, jest niedozwolone. – Abhijeet

3

Tims odpowiedź wydaje mi się mylące. Zwłaszcza, gdy urllib2 nie zwraca oczekiwanego kodu. Na przykład ten błąd będzie fatalny (wierzcie lub nie - to nie jest rzadkością, jeden przy pobieraniu URL):

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

szybko, ale może nie jest najlepszym rozwiązaniem byłoby kod za pomocą zagnieżdżonych try/z wyjątkiem bloku:

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

Więcej informacji na temat zagnieżdżonych próbie/z wyjątkiem bloków Are nested try/except blocks in python a good programming practice?