2012-01-06 71 views
8

首先,我的問題與this one非常相似。我想urllib.urlopen()的超時生成一個我可以處理的異常。如何處理Python 3中的urllib超時?

這不屬於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.') 

錯誤消息:

RESP = urllib.request.urlopen(REQ,超時= 10).read()進行解碼( 'UTF-8')
文件「/ USR /lib/python3.2/urllib/request.py「,第138行,在urlopen
return opener.open(url,data,timeout)
文件」/usr/lib/python3.2/urllib/request.py 「,第369行開放
response = self._open(req,data)
File」 /usr/lib/python3.2/urllib/request.py「,第387行,在_open
'_open',req)
文件」/usr/lib/python3.2/urllib/request.py「,行347,在_call_chain
結果= FUNC(*參數)
文件 「/usr/lib/python3.2/urllib/request.py」,線1156,在http_open
返回self.do_open(http.client.HTTPConnection ,REQ)
文件 「/usr/lib/python3.2/urllib/request.py」,線1141,在do_open
R = h.getresponse()
文件「/usr/lib/python3.2/ http/client.py「,第1046行,請求回覆
sponse.begin()
文件 「/usr/lib/python3.2/http/client.py」,線路346,在開始
版本,狀態原因= self._read_status()
文件「的/ usr/lib/python3.2/http/client.py「,第308行,在_read_status中
line = str(self.fp.readline(_MAXLINE + 1),」iso-8859-1「)
」/ usr/LIB/python3.2/socket.py」,線路276,在readinto
返回self._sock.recv_into(b)中
socket.timeout:超時

有一個主要茶當他們將urlliburllib2模塊重新組織爲urllib時,他們從Python 3開始。是否有可能導致這種變化?

+0

發現異常類型的一個簡單方法是'除了異常作爲e:print(type(e))' 。假設你可以重現你的例外,那就是。 – polvoazul 2018-02-16 20:44:39

回答

18

唯一的例外是從套接字超時,所以

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

應該抓住新的異常。雖然我不確定這是否回答你的問題,因爲我不知道你的問題是什麼。