2010-07-15 16 views
10

Come posso rilevare gli errori 404 e 403 per le pagine in python e urllib (2), ad esempio?Errori HTTP durante la cattura

Ci sono modi veloci senza grandi involucri di classe?

Aggiunto info (stack trace):

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    page = urllib2.urlopen("http://localhost:4444") 
    File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 111] Connection refused> 

risposta

20
import urllib2 
try: 
    page = urllib2.urlopen("some url") 
except urllib2.HTTPError, err: 
    if err.code == 404: 
     print "Page not found!" 
    elif err.code == 403: 
     print "Access denied!" 
    else: 
     print "Something happened! Error code", err.code 
except urllib2.URLError, err: 
    print "Some other error happened:", err.reason 

Nel tuo caso, l'errore si verifica già prima che la connessione HTTP potrebbe essere costruito - pertanto è necessario aggiungere un altro gestore degli errori che cattura URLError. Ma questo non ha nulla a che fare con gli errori 404 o 403.

+0

Questo funziona per 403, ma non 404. 'urllib2.URLError: ' – Ockonal

+0

Ecco perché non è un errore 404 che stai vedendo. Il messaggio di errore dice "Connessione rifiutata" - non "Pagina non trovata". –

+0

Sì, hai ragione. Ma c'è anche una lunga traccia di eccezioni. Quindi questa è un'eccezione non riconosciuta, giusto? Il problema principale è catturare esattamente quell'errore. Potresti aiutare anche con questo? – Ockonal

5
req = urllib2.Request('url') 
>>> try: 
>>>  urllib2.urlopen(req) 
>>> except urllib2.URLError, e: 
>>>  print e.code 
>>>  print e.read() 
Problemi correlati