但是在我的情况下,我不希望我的函数在设定的重试次数后失败或抛出错误。我想捕获错误并记录它并继续执行其余代码。尝试了多种方法,但对我不起作用。如果有人可以提供帮助,那就太好了。下面是示例代码。如果我没有正确处理其他自定义异常,也请发表评论。
import random, time
from functools import wraps
class ThrottledException(Exception):
pass
def retry(ExceptionToCheck, retries=5, delay=1, backoff=2, logger=None):
"""Retry calling the decorated function using an exponential backoff.
"""
def deco_retry(f):
@wraps(f)
def f_retry(*args, **kwargs):
_tries, _delay = retries, delay
while _tries >= 1:
try:
return f(*args, **kwargs)
except ExceptionToCheck:
msg = f"{ExceptionToCheck}, Retrying in {_delay} seconds"
if logger:
#logger.exception(msg) # would print stack trace
logger.warning(msg)
else:
print(msg)
time.sleep(_delay)
_tries -= 1
_delay *= backoff
return f(*args, **kwargs)
return f_retry # true decorator
return deco_retry
@retry(ThrottledException, retries=1, delay=1,backoff=2)
def testfunction(param1, param2, param3):
try:
#response = requests.request("POST", url, headers=headers, data=payload)
rnd = random.random()
print(rnd)
if rnd < 0.5:
response = "Too Many Requests"
raise ThrottledException
else:
response = {"response":"created"}
return response
except ThrottledException as e:
raise ThrottledException
except Exception as e:
print("Generic Exception")
res = testfunction('test',{'test1':'test1'}, {'test2':'test2'})
print(res)