连接重置后的重试

0 投票
1 回答
3695 浏览
提问于 2025-04-16 09:27

我正在使用 urllib.request 从网上下载文件。不过,有时候会遇到 Connection Reset by Peer 的错误,我想要重试一下。

我试过以下的方法,但似乎 e.errno 里包含的是 socket error,而不是一个真正的错误号:

while True:
  try:
    filename, headers = urllib.request.urlretrieve(url)
    break
  except IOError as e:
    if e.errno != errno.ECONNRESET:
      raise
  except Exception as e:
    raise

有什么建议吗?

1 个回答

3

首先,这部分其实是不必要的。

except Exception as e:
    raise

IOError的参数包括错误的类型(比如说是socket错误)和给它的错误信息。这个错误其实不是最初的错误,而是那个错误在args里面,所以……

except IOError as e:
    if e.args[1].args[0].errno != errno.ECONNRESET:
       raise

应该可以正常工作。我没有一个会重置的服务器,所以不能百分之百测试。但它在遇到ECONNREFUSED的时候是可以工作的。:-)

撰写回答