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.