2012-01-06 14 views
8

En primer lugar, mi problema es bastante similar a this one. Me gustaría un tiempo de espera de urllib.urlopen() para generar una excepción que pueda manejar.¿Cómo manejar el tiempo de espera de urllib en Python 3?

¿Esto no cae bajo URLError?

try: 
    response = urllib.request.urlopen(url, timeout=10).read().decode('utf-8') 
except (HTTPError, URLError) as error: 
    logging.error(
     'Data of %s not retrieved because %s\nURL: %s', name, error, url) 
else: 
    logging.info('Access successful.') 

El mensaje de error:.

resp = urllib.request.urlopen (req, timeout = 10) .read() descodificar ('utf-8')
Archivo "/ usr /lib/python3.2/urllib/request.py ", línea 138, en urlopen
return opener.open (url, data, timeout)
Archivo" /usr/lib/python3.2/urllib/request.py ", línea 369, en abierto
response = self._open (req, data)
Archivo" /usr/lib/python3.2/urllib/request.py ", línea 387, en _open
'_open', req)
Archivo" /usr/lib/python3.2/urllib/request.py ", línea 347, en _call_chain
resultado = func (* args)
de archivos "/usr/lib/python3.2/urllib/request.py", línea 1156, en http_open
self.do_open retorno (http.client.HTTPConnection , req)
archivo "/usr/lib/python3.2/urllib/request.py", línea 1141, en do_open
r = h.getresponse()
archivo "/usr/lib/python3.2/ http/client.py ", línea 1046, en la respuesta
re sponse.begin()
Archivo "/usr/lib/python3.2/http/client.py", línea 346, en comenzar
versión, estado, razón = self._read_status()
Archivo "/ usr/lib/python3.2/http/client.py ", línea 308, en _read_status
line = str (self.fp.readline (_MAXLINE + 1)," iso-8859-1 ")
Archivo"/usr/lib/python3.2/socket.py", línea 276, en readinto
self._sock.recv_into retorno (b)
socket.timeout: Tiempo de espera agotado

Hubo un cha importante nge en Python 3 cuando reorganizaron los módulos urllib y urllib2 en urllib. ¿Es posible que haya un cambio que cause esto?

+0

Una forma fácil de descubrir los tipos de excepción es 'excepto Excepción como e: imprimir (tipo (e))' . Asumiendo que puedes reproducir tus excepciones, eso es. – polvoazul

Respuesta

18

La excepción es el tiempo de espera de la toma, por lo

from socket import timeout 
try: 
    response = urllib.request.urlopen(url, timeout=10).read().decode('utf-8') 
except (HTTPError, URLError) as error: 
    logging.error('Data of %s not retrieved because %s\nURL: %s', name, error, url) 
except timeout: 
    logging.error('socket timed out - URL %s', url) 
else: 
    logging.info('Access successful.') 

debe coger la nueva excepción. Aunque no estoy seguro de que eso responda a su pregunta, ya que no estoy seguro de cuál es su pregunta ...

Cuestiones relacionadas