0

我尝试使用实现重试例程中的参考代码为我的函数实现指数退避

但是在我的情况下,我不希望我的函数在设定的重试次数后失败或抛出错误。我想捕获错误并记录它并继续执行其余代码。尝试了多种方法,但对我不起作用。如果有人可以提供帮助,那就太好了。下面是示例代码。如果我没有正确处理其他自定义异常,也请发表评论。

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)
4

0 回答 0