Python自定义重试装饰器
代码如下:
import random
import time
from functools import wraps
def fail_retry(try_times, time_delay):
def decorator(func):
@wraps(func)
def wrapper():
n = 1
current_result = func()
while not current_result:
print(f"开始第{n}次重试....")
time.sleep(time_delay)
retry_result = func()
if retry_result:
current_result = retry_result
break
n += 1
if n > try_times:
break
return current_result
return wrapper
return decorator
@fail_retry(try_times=5, time_delay=1)
def test():
try:
return 10 / random.randint(0, 1)
except Exception as e:
print(f"执行失败,当前执行错误码为:{e}")
return None
for i in range(1, 10):
print(f"{'='*10}开始第{i}次测试{'='*10}")
print(f"测试成功的的结果是:{test()}")
执行结果如下:
==========开始第1次测试==========
执行失败,当前执行错误码为:division by zero
开始第1次重试....
测试成功的的结果是:10.0
==========开始第2次测试==========
执行失败,当前执行错误码为:division by zero
开始第1次重试....
测试成功的的结果是:10.0
==========开始第3次测试==========
执行失败,当前执行错误码为:division by zero
开始第1次重试....
测试成功的的结果是:10.0
==========开始第4次测试==========
测试成功的的结果是:10.0
==========开始第5次测试==========
测试成功的的结果是:10.0
==========开始第6次测试==========
执行失败,当前执行错误码为:division by zero
开始第1次重试....
执行失败,当前执行错误码为:division by zero
开始第2次重试....
执行失败,当前执行错误码为:division by zero
开始第3次重试....
测试成功的的结果是:10.0
==========开始第7次测试==========
执行失败,当前执行错误码为:division by zero
开始第1次重试....
执行失败,当前执行错误码为:division by zero
开始第2次重试....
执行失败,当前执行错误码为:division by zero
开始第3次重试....
测试成功的的结果是:10.0
==========开始第8次测试==========
测试成功的的结果是:10.0
==========开始第9次测试==========
测试成功的的结果是:10.0
Process finished with exit code 0