我有一个用Python / Mechanize编写的大型批量下载应用程序,旨在下载20,000个文件。显然,任何大的下载程序偶尔会遇到一些ECONNRESET
错误。现在,我知道如何处理each of these individually,但有两个问题:
即使我这样做,一旦抛出异常,就会知道如何处理错误。如果代码只是
data = browser.response().read()
然后我知道如何处理它,即:
data = None
while (data == None):
try:
data = browser.response().read()
except IOError as e:
if e.args[1].args[0].errno != errno.ECONNRESET:
raise
data = None
但如果它只是
的随机实例browser.follow_link(link)
然后,如果ECONNRESET
被抛到这里,我怎么知道Mechanize的内部状态是什么样的?例如,在我再次尝试代码之前,是否需要调用browser.back()
?从这种错误中恢复的正确方法是什么?
答案 0 :(得分:2)
也许将try..except块放在命令链中更高的位置:
import collections
def download_file(url):
# Bundle together the bunch of browser calls necessary to download one file.
browser.follow_link(...)
...
response=browser.response()
data=response.read()
urls=collections.deque(urls)
while urls:
url=urls.popleft()
try:
download_file(url)
except IOError as err:
if err.args[1].args[0].errno != errno.ECONNRESET:
raise
else:
# if ECONNRESET error, add the url back to urls to try again later
urls.append(url)