有一个通过网络获取数据的函数(可能会因为网络原因出现异常),写一个装饰器,让这个函数在出现异常时,可以重试指定的次数,并在每次重试之前随机延迟一段时间

code:

import random,time # 导入随机/时间模块
def retry(times=1,custom_exception=None,delay_time_in=1):
    """times:重试次数
        custom_exception: 自定义异常
        delay_time_in:延迟随机时间段[0,delay_time]
    """
    def outer(func):
        def inner(*args,**kwargs):
            for x in range(times): # 重复次数
                if x > 0: # 第一次装饰 不需要等待时间
                    delay_ = random.uniform(0, delay_time_in) # 随机延迟时间段
                    time.sleep(delay_)
                    print(f"第{x}次循环所使用延迟时间:",delay_)
                try:
                    return func(*args,**kwargs) # 无异常,直接返回被装饰的函数
                except Exception as e: # 捕获所有的异常
                    if x+1 == times: # 重复次数判定,未满足则进入循环
                        if custom_exception: # 当循环次数到达后,外部传有自定义异常信息,则抛出自定义异常信息
                            raise custom_exception
                        else: # 外部未传有自定义错误信息,则抛出捕获的异常信息
                            raise e
        return inner
    return outer
    
# 测试函数
@retry(3,custom_exception=Exception("自定义错误"),delay_time_in=3)
def test(str):
    j = 5
    return j + str

#测试
if __name__ == "__main__":
    print(test("test"))

output:

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值