如何在Python Tenacity重试中获取错误信息且不终止程序?
解决tenacity重试时获取错误信息且不终止程序的方法
核心思路是利用RetryCallState对象的outcome.exception()方法获取异常实例——这个方法不会抛出异常,只会返回错误对象,完美替代会终止程序的result()。
具体实现步骤
- 定义一个回调函数,接收
RetryCallState参数,通过outcome.exception()提取错误信息并打印 - 在
@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
相关产品推荐
相关产品推荐

