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

如何在Python Tenacity重试中获取错误信息且不终止程序?

解决tenacity重试时获取错误信息且不终止程序的方法

核心思路是利用RetryCallState对象的outcome.exception()方法获取异常实例——这个方法不会抛出异常,只会返回错误对象,完美替代会终止程序的result()。

具体实现步骤

  1. 定义一个回调函数,接收RetryCallState参数,通过outcome.exception()提取错误信息并打印
  2. 在@retry装饰器中指定before_sleep(或after)参数,绑定这个回调函数,让它在每次重试触发时执行

代码示例

from tenacity import retry, stop_after_attempt, wait_exponential, RetryCallState
import random

# 模拟会随机抛出不同错误的目标函数
def unstable_func():
    error_classes = [ValueError, ConnectionError, TimeoutError]
    selected_error = random.choice(error_classes)
    raise selected_error(f"本次错误类型: {selected_error.__name__}")

# 自定义重试错误日志函数
def log_retry_details(retry_state: RetryCallState):
    exc = retry_state.outcome.exception()
    if exc:
        print(f"第{retry_state.attempt_number}次重试失败 | 错误类型: {type(exc).__name__} | 错误信息: {str(exc)}")

# 配置重试规则并绑定日志回调
@retry(
    stop=stop_after_attempt(5),  # 最多重试5次
    wait=wait_exponential(multiplier=1, min=2, max=10),  # 指数退避等待
    before_sleep=log_retry_details  # 每次重试休眠前打印错误
)
def main():
    unstable_func()

if __name__ == "__main__":
    try:
        main()
    except Exception as final_exc:
        print(f"\n所有重试失败,最终错误: {str(final_exc)}")

关键说明

  • RetryCallState包含了重试的所有状态信息:当前重试次数、调用结果outcome等
  • outcome.exception():仅返回异常对象,不会触发异常抛出,避免程序终止
  • before_sleep回调会在每次重试的等待操作前执行,刚好对应重试失败后的错误记录时机

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:13:20