Python:如何在遇到超时时重试

新手上路,请多包涵

我有一个连接到服务器以向其发送一些命令的 Python 程序,但偶尔会出现此错误:

TimeoutError: [WinError 10060] A connection attempt failed because the connected party didn’t properly respond after a period time, or established connection failed because connected host has failed respond 超时错误:[WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应

在以前这样的情况下,我会使用这样的东西:

 try:
            Do something
        except KeyError:
            do something else

我可以在同样的情况下做同样的事情吗? IE,

 try:
                Do something
            except TimeoutError:
               Do something again

如果是这样,除了 TimeoutError 之后我会做什么?我会再次执行相同的命令吗?

原文由 ark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 751
2 个回答

我可以在同样的情况下做同样的事情吗

是的!您可以使用 try / except 对于 任何 异常,并且 TimeoutError 没什么特别的。

如果是这样,除了 TimeoutError 之后我会做什么?我会再次执行相同的命令吗?

如果您只想重试一次,并让第二次超时算作真正的错误,是的:

 try:
    do something
except TimeoutError:
    do something

(如果“做某事”不仅仅是一个简单的陈述,您可能想要分解出代码,这样您就不会重复自己。)

但是,如果你想重试多次,你可能需要一个循环:

 for _ in range(max_retries):
    try:
        do something
        break
    except TimeoutError:
        pass

您可能想在 --- 中添加一个 else for 来区分这两种情况(成功,并执行了 break ,而从未成功,而从未用完–的尝试)。


由于这里的想法通常是处理可能的暂时性错误,因此您可能需要添加其他内容,例如:

  • max_retries 之后重新引发错误,或引发不同的错误。
  • 日志级别逐渐升高(例如,针对单个故障的调试消息,但针对“max_retries”的警告)。
  • 使用指数退避重试(等待 1 秒,然后 2、4、8,…)。
  • 将 URL 推送到工作队列的末尾,而不是立即重试。如果您还想要 max_retries 逻辑,则可以使用 (URL, retry_count) (URL, timestamp) ,如果您还想要指数退避,则可以使用 --- 对,或者两者都使用。 (当然,这仅在您不关心响应顺序或可以在最后重新排序时才有效。)
  • 不同异常的不同规则(例如,500、502、503 和 504 错误都可能由服务器或代理过载引起,但最佳重试逻辑可能不同——2018 年的最佳启发式可能不同于 2010 年或2025 年)。

对于复杂的组合,重试装饰器(如 jterrace 的有用答案链接 的装饰器)是结束行为的好方法。

原文由 abarnert 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以像您提到的那样捕获 TimeoutError :

 import socket
import sys
try:
  dosomething()
except socket.TimeoutError:
  print >> sys.stderr, 'Retrying after TimeoutError'
  dosomething()

您还可以在函数上使用 重试装饰器模式

 @retry(socket.TimeoutError)
def dosomething():
    # code that causes a TimeoutError
    ...

原文由 jterrace 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题