从Python/Mechaniz中的econreset恢复

2024-09-29 21:40:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用Python/Mechanize编写的大批量下载应用程序,目标是下载大约20000个文件。显然,任何如此大的下载器都会偶尔遇到ECONNRESET错误。现在,我知道如何处理each of these individually,但这有两个问题:

  1. 我真的不想把每个出站web调用都打包到try/catch块中。在
  2. 即使我要这样做,一旦异常被抛出,也很难知道如何处理错误。如果代码只是

    data = browser.response().read()
    

    然后我就知道如何处理它,即:

    ^{pr2}$

    但如果只是

    browser.follow_link(link)
    

    那么,如果在这里的某个地方抛出ECONNRESET,我怎么知道Mechanize的内部状态是什么样子呢?例如,在我再次尝试代码之前,是否需要调用browser.back()?从这种错误中恢复过来的正确方法是什么?

编辑:接受的答案中的解决方案肯定有效,而在我的例子中,它并不难实现。然而,我仍然对是否有一种错误处理机制能够更快地捕捉错误感兴趣。在


Tags: 文件of代码browserweb应用程序目标错误
1条回答
网友
1楼 · 发布于 2024-09-29 21:40:01

或许可以将try…except block放在命令链的更高位置:

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)

相关问题 更多 >

    热门问题