2011-02-15 116 views
2

幫助這裏是我目前正在使用的代碼:學習Python異常處理

url = locations[state]['url'] 
headers = {'User-Agent':'Firefox/3.6.13'} 
req = urllib.request.Request(url, headers=headers) 
try: 
    resp = urllib.request.urlopen(req) 
except: 
    print('Caught error, trying again...') 
    print('This should be handled better, I\'m sorry') 
    time.sleep(2) 
    resp = urllib.request.urlopen(req)

我得到的問題,因而我真正關心的例外是,這將偶有發生時提出請求:

URLError: <urlopen error [Errno 104] Connection reset by peer> 

這並不是確切的錯誤,我想這可能是爲Python 2.x中的urllib的/ urllib2的和我在python3,我認爲這是urllib.error.URLError IIRC。無論如何,我知道我可以做的除了URLError,它應該工作(雖然我想知道是否需要做urllib.error.URLError,因爲這是它的報告),但我該如何測試,以確保它是因爲104.我希望它不斷重試,直到它獲得它,或者至少嘗試指定次數,我將如何最優雅地做到這一點?

從我能找到的錯誤104是因爲我的本地路由器無法處理請求,並且嚇壞了,我猜測是因爲它無法如此迅速地處理請求?如果任何人有什麼進一步的洞察力,那會是有益的,但我並不太在意。

回答

-1

首先,沒有理由在新代碼中使用urllib,建議使用urllib2代替。

我的理解,要重試只如果你有錯誤104.這是它是如何在Python通常做:

import time, urllib.request, urllib2.error 
RETRY_DELAY = 2 

# build req here 
# ... 

for x in range(10): # Always limit number of retries 
    try: 
    resp = urllib.request.urlopen(req) 
    except urllib.error.URLError: 
    if e.reason[0] == 104: # Will throw TypeError if error is local, but we probably don't care 
     time.sleep(RETRY_DELAY) 
    else: 
     raise # re-raise any other error 
    else: 
    break # We've got resp sucessfully, stop iteration 
+0

注意`code`屬性只存在於`HTTPError`實例幷包含一個HTTP狀態碼,而不是一個errno值。 – ncoghlan 2011-02-15 07:17:42