如何在异常后重试?

422 投票
29 回答
572769 浏览
提问于 2025-04-15 18:08

我有一个循环,开始时用的是 for i in range(0, 100)。通常情况下,它运行得很好,但有时候因为网络状况不佳会出错。目前我设置的是,如果出错了,它会在异常处理的部分用 continue 跳过这次,继续下一个 i 的值。

我想知道,能不能把出错的那个 i 的值重新赋值,然后再重新执行这一轮的循环呢?

29 个回答

111

更新于2021年12月1日:

从2016年6月开始,retrying这个包就不再维护了。建议使用一个活跃的分支,github.com/jd/tenacity,或者可以选择另一个叫做github.com/litl/backoff的包。


retrying包是一个很不错的工具,可以在代码出错时重新尝试执行一段代码。

举个例子:

@retry(wait_random_min=1000, wait_random_max=2000)
def wait_random_1_to_2_s():
    print("Randomly wait 1 to 2 seconds between retries")
345

我更倾向于限制重试的次数,这样如果某个特定的项目出现问题,你最终会继续处理下一个项目。这样做的原因是:

for i in range(100):
  for attempt in range(10):
    try:
      # do thing
    except:
      # perhaps reconnect, etc.
    else:
      break
  else:
    # we failed all the attempts - deal with the consequences.
562

在你的 for 循环里面加一个 while True,把你的 try 代码放进去,只有当你的代码成功执行时,才跳出这个 while 循环。

for i in range(0,100):
    while True:
        try:
            # do stuff
        except SomeSpecificException:
            continue
        break

撰写回答