2010-07-15 13 views
10

¿cómo puedo detectar los errores 404 y 403 para páginas en python y urllib (2), por ejemplo?Catching http errors

¿Hay formas rápidas sin grandes contenedores de clase?

información Agregado (seguimiento de la pila):

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> 

Respuesta

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 

En su caso, el error ocurre ya antes de la conexión HTTP se podría construir - por lo tanto, es necesario agregar otro manejador de errores que detecta URLError. Pero esto no tiene nada que ver con los errores 404 o 403.

+0

Esto funciona para 403, pero no 404. 'urllib2.URLError: ' – Ockonal

+0

Eso es porque no es un error 404 que se está viendo. El mensaje de error dice "Conexión rechazada" - no "Página no encontrada". –

+0

Sí, tienes razón. Pero también hay un largo rastro de excepción antes de él. Entonces esa es una excepción no capturada, ¿verdad? El principal problema es captar exactamente ese error. ¿Podrías ayudar con esto también? – Ockonal

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