从Python / Mechanize中的ECONNRESET中恢复

时间:2011-01-31 18:54:02

标签: python error-handling tcp mechanize

我有一个用Python / Mechanize编写的大型批量下载应用程序,旨在下载20,000个文件。显然,任何大的下载程序偶尔会遇到一些ECONNRESET错误。现在,我知道如何处理each of these individually,但有两个问题:

  1. 我真的不想在try / catch块中包装每一个出站Web调用。
  2. 即使我这样做,一旦抛出异常,就会知道如何处理错误。如果代码只是

    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()?从这种错误中恢复的正确方法是什么?

  3. 编辑:接受的答案中的解决方案当然有效,而在我的案例中,结果并非如此难以实现。然而,我仍然对学术上感兴趣,是否存在可能导致更快错误捕获的错误处理机制。

1 个答案:

答案 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)