python重试装饰器示例


当然,下面是一个简单的Python重试装饰器示例。这个装饰器将尝试执行被装饰的函数,如果函数抛出指定的异常,它将重试指定的次数。


import time
from functools import wraps

def retry(exceptions=(Exception,), tries=4, delay=3):
    """
    重试装饰器。

    参数:
    - exceptions: 触发重试的异常类型元组。默认为所有异常。
    - tries: 最大重试次数。默认为4次。
    - delay: 重试之间的延迟秒数。默认为3秒。
    """
    def deco_retry(f):
        @wraps(f)
        def f_retry(*args, **kwargs):
            mtries, mdelay = tries, delay
            while mtries > 1:
                try:
                    return f(*args, **kwargs)
                except exceptions as e:
                    print(f"捕获到异常: {e},将在 {mdelay} 秒后重试...")
                    time.sleep(mdelay)
                    mtries -= 1
                    mdelay *= 2
            return f(*args, **kwargs)
        return f_retry
    return deco_retry

# 使用示例
@retry(tries=3, delay=2, exceptions=(ValueError,))
def might_fail():
    print("尝试执行...")
    # 假设这里有可能抛出ValueError
    raise ValueError("失败了,需要重试")

might_fail()

这个装饰器`retry`接受三个参数:`exceptions`、`tries`和`delay`。`exceptions`是一个异常类型元组,用于指定哪些异常会导致重试。`tries`是最大重试次数,`delay`是重试之间的延迟时间(秒)。

在`might_fail`函数中,我们模拟了一个可能抛出`ValueError`异常的场景。当`might_fail`函数被调用时,装饰器会捕获`ValueError`,然后等待指定的延迟时间后再次尝试调用`might_fail`,直到达到最大重试次数或成功执行为止。

注意,在最后一次尝试时,即使函数再次抛出异常,它也不会被捕获并重新尝试,因为此时已经没有更多的重试机会了。