脚本随机行异常处理:休眠后重试出错行而非前置代码
嘿,这个需求我太熟了——很多时候处理不稳定的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("脚本执行结束")
这样一来:
- 任何一行出错后,都会自动休眠指定的秒数
- 只反复执行出错的那一行代码,直到成功
- 之前已经执行成功的代码(比如第一个print、已经获取到的user_data)完全不会重复运行
额外优化建议
- 幂等性检查:确保你重试的代码是幂等的(比如重复调用不会重复创建数据、重复扣费),如果不是,要在代码里加去重/判断逻辑
- 自定义异常捕获:如果只需要捕获特定类型的异常(比如网络错误),可以把
except Exception改成except requests.exceptions.RequestException这类具体异常 - 动态调整休眠时间:可以改成指数退避(比如第一次休眠3秒,第二次6秒,第三次12秒),避免频繁重试给服务造成压力
内容的提问来源于stack exchange,提问作者bsperl
相关产品推荐
相关产品推荐

