You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

脚本随机行异常处理:休眠后重试出错行而非前置代码

嘿,这个需求我太熟了——很多时候处理不稳定的API调用、文件操作或者第三方服务时,都会遇到这种随机报错的情况。刚好你的三个要求都能通过一个通用的重试工具函数来实现,下面给你一步步拆解:

核心思路:给单个代码行加「重试包裹」

要避免重新执行错误发生前的所有代码,关键是不要把整个脚本放进重试循环,而是把每一段可能出错的代码(单个行或小逻辑块)单独包裹进重试逻辑里。这样一旦某行出错,只会重试这一行,之前已经执行成功的代码完全不受影响。

实现通用重试函数

我用Python写一个通用的重试函数(其他语言思路类似,比如Shell可以用函数加循环,JavaScript用async函数),完美覆盖你的三个要求:

import time
import traceback

def retry_on_failure(func, sleep_secs=5, max_retries=None):
    """
    重复执行传入的函数,直到成功或达到最大重试次数
    :param func: 要执行的函数/代码块(用lambda包装单行代码)
    :param sleep_secs: 出错后休眠的秒数
    :param max_retries: 最大重试次数,None表示无限重试
    """
    retry_count = 0
    while True:
        try:
            # 执行目标代码,成功就返回结果
            return func()
        except Exception as e:
            retry_count += 1
            # 检查是否超过最大重试次数
            if max_retries is not None and retry_count > max_retries:
                print(f"已达到最大重试次数 ({max_retries}),放弃执行")
                raise e  # 抛出最终的异常,让上层处理
            # 打印错误信息方便调试
            print(f"执行出错(第 {retry_count} 次重试): {str(e)}")
            traceback.print_exc()  # 打印完整的错误栈
            # 休眠后重试
            print(f"休眠 {sleep_secs} 秒后重试...")
            time.sleep(sleep_secs)
如何应用到你的脚本里

假设你原来的脚本是这样的(有几个不稳定的操作):

print("脚本开始执行")
# 不稳定的操作1:可能随机报错
user_data = fetch_user_data(123)
# 不稳定的操作2:可能随机报错
save_to_database(user_data)
# 稳定的操作:不会报错
send_notification("数据同步完成")
print("脚本执行结束")

现在用retry_on_failure把每个不稳定的操作单独包裹起来,注意用lambda把单行代码转成可调用的函数:

print("脚本开始执行")
# 只重试fetch_user_data这一行,之前的print不会重复执行
user_data = retry_on_failure(lambda: fetch_user_data(123), sleep_secs=3)
# 只重试process_user_data这一行,fetch_user_data不会重新跑
processed_data = retry_on_failure(lambda: process_user_data(user_data), sleep_secs=2)
save_to_database(processed_data)
send_notification("数据同步完成")
print("脚本执行结束")

这样一来:

  1. 任何一行出错后,都会自动休眠指定的秒数
  2. 只反复执行出错的那一行代码,直到成功
  3. 之前已经执行成功的代码(比如第一个print、已经获取到的user_data)完全不会重复运行
额外优化建议
  • 幂等性检查:确保你重试的代码是幂等的(比如重复调用不会重复创建数据、重复扣费),如果不是,要在代码里加去重/判断逻辑
  • 自定义异常捕获:如果只需要捕获特定类型的异常(比如网络错误),可以把except Exception改成except requests.exceptions.RequestException这类具体异常
  • 动态调整休眠时间:可以改成指数退避(比如第一次休眠3秒,第二次6秒,第三次12秒),避免频繁重试给服务造成压力

内容的提问来源于stack exchange,提问作者bsperl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:51:54