2012-01-06 16 views
8

Prima di tutto, il mio problema è abbastanza simile a this one. Vorrei un timeout di urllib.urlopen() per generare un'eccezione che posso gestire.Come gestire il timeout di urllib in Python 3?

Questo non rientra in 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.') 

Il messaggio di errore:.

resp = urllib.request.urlopen (req, timeout = 10) .read() decodificare ('utf-8')
file "/ usr /lib/python3.2/urllib/request.py "linea 138, in urlopen
opener.open ritorno (url, i dati, timeout)
File" /usr/lib/python3.2/urllib/request.py ", riga 369, in open
response = self._open (req, data)
File" /usr/lib/python3.2/urllib/request.py", la linea 387, in _open
'_open', req)
File "/usr/lib/python3.2/urllib/request.py", linea 347, in _call_chain
risultato = func (* args)
file "/usr/lib/python3.2/urllib/request.py", linea 1156, in http_open
self.do_open ritorno (http.client.HTTPConnection , req)
File "/usr/lib/python3.2/urllib/request.py", la linea 1141, in do_open
r = h.getresponse()
File "/usr/lib/python3.2/ http/client.py ", riga 1046, in getresponse
re sponse.begin()
File "/usr/lib/python3.2/http/client.py", la linea 346, in cominciano
versione, lo stato, la ragione = self._read_status()
file "/ usr/lib/python3.2/http/client.py ", riga 308, in _read_status
line = str (self.fp.readline (_MAXLINE + 1)," iso-8859-1 ")
File"/usr/lib/python3.2/socket.py", la linea 276, in readinto
ritorno self._sock.recv_into (b)
socket.timeout: scaduta

C'è stato un importante cha nge di in Python 3 quando hanno riorganizzato i moduli urllib e urllib2 in urllib. È possibile che ci sia stato un cambiamento in quel caso?

+0

Un modo semplice per scoprire i tipi di eccezione è di "tranne Eccezione come e: print (type (e))' . Supponendo che tu possa riprodurre le tue eccezioni, cioè. – polvoazul

risposta

18

L'eccezione è timeout da presa, in modo da

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

dovrebbe prendere la nuova eccezione. Anche se non sono sicuro che questo risponda alla tua domanda, dato che non sono sicuro di quale sia la tua domanda ..

Problemi correlati