一,重试的常见用例

重试库 tenacity

关于重试的几点说明:

  • 重试是对整个方法再次从头执行一遍,所以在添加 “重试” 的逻辑时,需要考虑重试的力度
  • 可以对指定的异常进行重试,非指定异常不重试
  • 异常如果被 except 捕获,如果不抛出去,则方法没有异常,@retry 会失效
from tenacity import (
    retry,
    retry_if_exception_type,
    stop_after_attempt,
    wait_exponential,
)


raise_again_attempt = 0
swallow_exception_attempt = 0

# 装饰器
@retry(
    # 触发重试的异常类型
    retry=retry_if_exception_type(ValueError),
    
    # 重试次数
    stop=stop_after_attempt(3),
    
    # 指数退避策略。 multiplier 表示每次重试间隔时间的基数(可理解为第一次等待的时间), min 最少间隔时间,max 最大间隔时间
    wait=wait_exponential(multiplier=0, min=0, max=0), 
    
    # 重试次数耗尽后,抛出什么异常。True 表示抛出业务原始异常, False 表示抛出 tenacity 自己封装的 RetryError 
    reraise=True,
)
def raise_again_demo():
    """函数内部 catch 后继续 raise:每次重试都会执行 except 和 finally。"""
    global raise_again_attempt
    raise_again_attempt += 1

    try:
        print(f"\n第 {raise_again_attempt} 次进入 raise_again_demo")
        print("业务代码:准备抛出异常")
        raise ValueError("模拟业务异常")
    except Exception as exc:
        print(f"函数内部 except/catch 执行了:{exc!r}")
        raise
    finally:
        print("函数内部 finally 执行了")





if __name__ == "__main__":
    try:
        raise_again_demo()
    except Exception as exc:
        print(f"main 最终捕获到异常:{exc!r}")


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐