以下是我目前正在使用的代码:
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是因为我的本地路由器无法处理请求并且吓坏了,我猜是因为它无法如此快速地处理请求?如果有人对这是什么原因有任何进一步的了解,那也会有所帮助,但我并不太关心。
答案 0 :(得分:1)
查看http://docs.python.org/py3k/library/urllib.error.html
查看异常的reason
属性后,您应该能够确定:
socket.error
个实例吗?errno.ECONNRESET
对应?答案 1 :(得分:-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