gpt4 book ai didi

python - 在 Python/Mechanize 中从 ECONNRESET 恢复

转载 作者:可可西里 更新时间:2023-11-01 02:41:51 24 4
gpt4 key购买 nike

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

  1. 我真的不想将每个出站网络调用都包装在 try/catch block 中。
  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()?从此类错误中恢复的正确方法是什么?

编辑:已接受答案中的解决方案当然有效,就我而言,实现起来并不难。然而,我在学术上仍然对是否存在可以导致更快地捕获错误的错误处理机制感兴趣。

最佳答案

也许将 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)

关于python - 在 Python/Mechanize 中从 ECONNRESET 恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4854809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com