当然,下面是一个简单的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`,直到达到最大重试次数或成功执行为止。
注意,在最后一次尝试时,即使函数再次抛出异常,它也不会被捕获并重新尝试,因为此时已经没有更多的重试机会了。