2012-01-06 11 views
8

Öncelikle benim sorunum this one'a oldukça benziyor. Işleyebileceğim bir özel durum oluşturmak için urllib.urlopen() bir zaman aşımı istiyorum.Python 3'te urllib zaman aşımı nasıl yapılır?

Bu, URLError'un altına düşmez mi?

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

hata iletisi.

solunum = urllib.request.urlopen (req, zaman aşımı = 10) .read() ('UTF-8')
Dosya "şifresini çözmek/usr /lib/python3.2/urllib/request.py ", satır 138, urlopen içinde
dönüş opener.open (url, veriler, zaman aşımı)
Dosya" /usr/lib/python3.2/urllib/request.py ", satır 369, açık olarak
yanıtı = self._open (req, veri)
Dosya" /usr/lib/python3.2/urllib/request.py ", satır 387, _open
'_open', req)
Dosya" /usr/lib/python3.2/urllib/request.py ", satır _call_chain
sonuç = fonksiyon içinde 347, (* args) http_open
dönüş self.do_open içinde
Dosya "/usr/lib/python3.2/urllib/request.py", hat 1156, (http.client.HTTPConnection do_open
r = h.getresponse olarak, Tlp)
Dosya "/usr/lib/python3.2/urllib/request.py", hat 1141,()
Dosya "/usr/lib/python3.2/ http/client.py ", satır 1046, getresponse içinde
re sponse.begin()
Dosya "/usr/lib/python3.2/http/client.py", hat 346, içinde
sürümü, statü, sebebi = self._read_status()
Dosya "/ usr/başlamak lib/python3.2/http/client.py ", satır 308, içinde _read_status
satır = str (self.fp.readline (_MAXLINE + 1)," iso-8859-1 ")
Dosya"/usr/readinto
dönüş self._sock.recv_into içinde lib/python3.2/socket.py", hat 276, (b)
socket.timeout: büyük cha vardı

zaman aşımına urllib ve urllib2 modüllerini urllib'a yeniden düzenlediklerinde Python 3'ün içinden nge. Buna sebep olan bir değişiklik oldu mu?

+0

İstisna türlerini keşfetmenin kolay bir yolu, "İstisna olarak e: print (type (e)) . İstisnalarınızı çoğaltabileceğinizi varsayarsak, yani. – polvoazul

cevap

18

istisna soketinden zaman aşımı, yani

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

yeni durum yakalamak gerekir. Sorunuzun ne olduğunu bilmediğimden emin değilim, ancak sorunuzun ne olduğundan emin değilim ..