example español python exception urllib

español - ¿Cómo manejar el tiempo de espera de urllib en Python 3?



urllib urlencode python 3 (2)

La excepción es el tiempo de espera de socket, por lo que

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.'')

Debería atrapar la nueva excepción.

En primer lugar, mi problema es bastante similar a este . Me gustaría un tiempo de espera de urllib.urlopen () para generar una excepción que pueda manejar.

¿No cae esto 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 (). decode (''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)
Archivo "/usr/lib/python3.2/urllib/request.py", línea 1156, en http_open
devolver self.do_open (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 getresponse
response.begin ()
Archivo "/usr/lib/python3.2/http/client.py", línea 346, en inicio
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 lectura
devuelve self._sock.recv_into (b)
socket.timeout: tiempo fuera

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


La respuesta anterior no intercepta correctamente los errores de tiempo de espera. Los errores de tiempo de espera se URLError como URLError , por lo que si queremos capturarlos específicamente, debemos escribir:

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

Tenga en cuenta que ValueError puede ValueError independiente, es decir, si la URL no es válida. Al igual que HTTPError , no está asociado con un tiempo de espera.