python捕获异常装饰器_python异常装饰器--比较全的版本了

#异常捕获装饰器(亦可用于类方法)

def try_except_log(f=None, max_retries: int = 5, delay: (int, float) = 1, step: (int, float) =0,

exceptions: (BaseException, tuple, list)= BaseException, sleep=time.sleep,

process=None, validate=None, callback=None, default=None):"""函数执行出现异常时自动重试的简单装饰器

:param f: function 执行的函数。

:param max_retries: int 最多重试次数。

:param delay: int/float 每次重试的延迟,单位秒。

:param step: int/float 每次重试后延迟递增,单位秒。

:param exceptions: BaseException/tuple/list 触发重试的异常类型,单个异常直接传入异常类型,多个异常以tuple或list传入。

:param sleep: 实现延迟的方法,默认为time.sleep。

在一些异步框架,如tornado中,使用time.sleep会导致阻塞,可以传入自定义的方法来实现延迟。

自定义方法函数签名应与time.sleep相同,接收一个参数,为延迟执行的时间。

:param process: 处理函数,函数签名应接收一个参数,每次出现异常时,会将异常对象传入。

可用于记录异常日志,中断重试等。

如处理函数正常执行,并返回True,则表示告知重试装饰器异常已经处理,重试装饰器终止重试,并且不会抛出任何异常。

如处理函数正常执行,没有返回值或返回除True以外的结果,则继续重试。

如处理函数抛出异常,则终止重试,并将处理函数的异常抛出。

:param validate: 验证函数,用于验证执行结果,并确认是否继续重试。

函数签名应接收一个参数,每次被装饰的函数完成且未抛出任何异常时,调用验证函数,将执行的结果传入。

如验证函数正常执行,且返回False,则继续重试,即使被装饰的函数完成且未抛出任何异常。

如验证函数正常执行,没有返回值或返回除False以外的结果,则终止重试,并将函数执行结果返回。

如验证函数抛出异常,且异常属于被重试装饰器捕获的类型,则继续重试。

如验证函数抛出异常,且异常不属于被重试装饰器捕获的类型,则将验证函数的异常抛出。

:param callback: 回调函数,函数签名应接收一个参数,异常无法处理时,会将异常对象传入。

可用于记录异常日志,发送异常日志等。

:param default: 默认值/默认值生成函数

:return: 被装饰函数的执行结果。"""

#带参数的装饰器

defdecorator(func):

@functools.wraps(func)def wrapper(*args, **kwargs):#nonlocal delay, step, max_retries

i =0

func_exc, exc_traceback=StopRetry, Nonewhile i

result= func(*args, **kwargs)#验证函数返回False时,表示告知装饰器验证不通过,继续重试

if callable(validate) and validate(result) isFalse:continue

else:returnresultexceptexceptions as ex:

func_exc, exc_traceback=ex, traceback.format_exc()#处理函数返回True时,表示告知装饰器异常已经处理,终止重试

ifcallable(process):try:if process(ex) isTrue:return default() if callable(default) elsedefaultexceptException as e:

func_exc, exc_traceback=e, traceback.format_exc()break

finally:

i+= 1sleep(delay+ step *i)else:#回调函数,处理自动无法处理的异常

ifcallable(callback):

callback(func_exc, exc_traceback)return default() if callable(default) elsedefaultpass

returnwrapperifcallable(f):returndecorator(f)return decorator

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab weibpdf函数,matlab建模常用函数

附录Ⅰ 工具箱函数汇总Ⅰ.1 统计工具箱函数表Ⅰ-1 概率密度函数函数名 对应分布的概率密度函数betapdf 贝塔分布的概率密度函数binopdf 二项分布的概率密度函数chi2pdf 卡方分布的概率密度函数exppdf 指数分布的概率密度函数fpdf f分布的概率密度函数gampdf 伽玛分布的概率密度…

拉普拉斯变换_拉普拉斯变换——奇妙的数学

无奈学不会工程数学中的拉普拉斯变换,没办法去感知他的存在形式,在YOUTOBE上看到一个讲解拉普拉斯变换的视频,好像懂了些,分享给同样迷茫的小伙伴,下载的时候是有字幕的,发到知乎上就没字幕了,英…

linux下计算目录文件和,统计Linux 中文件和文件夹/目录的数量(示例代码)

嗨,伙计们,今天我们再次带来一系列可以多方面帮助到你的复杂的命令。 通过操作命令,可以帮助您计数当前目录中的文件和目录、递归计数,统计特定用户创建的文件列表等。在本教程中,我们将向您展示如何使用多个命令&…

没有足够的值_元丰通宝值多少钱吗?市场价值如何?有没有足够的收藏空间?...

元丰通宝是宋代神宗年间发行的,那么你知道现在元丰通宝值多少钱吗?市场价值如何?有没有足够的收藏空间?宋代虽然没有强大的军事实力,但其国内经济水平得到了发展,在许多朝代都处于领先地位。在元丰通宝的铸…

Linux不能读取目录,关于Linux上面无法读取资源目录下文件的问题

一开始我的代码是这样子的,读取本地子路径下的json文件代码运行的时候,在window是可以正常的Overridepublic String getBannerStr() {String str "";try {Resource resource new ClassPathResource("json/abc.json");File file resource.getFile();str …

jsp中java代码无效_来杯咖啡,教你如何优雅的在java中统计代码块耗时

推荐阅读:Sping源码RedisNginxMySQL等七篇实战技术文档,阿里大佬推荐阿里内部:2020年全技术栈文档PPT分享,(万粉总结,回馈粉丝)在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况&#xff0c…

linux 随机抽取文件,shell 随机从文件中抽取若干行的实现方法

shuf -n5 main.txtsort -R main.txt | head -5awk -vN5 -vC"wc -l file" BEGIN{srand();while(nwhile read line;do echo "$line $RANDOM";done < main.txt | sort -k2,2n| awk NR<5{print $1}shuf 命令的选项&#xff1a;-e, --echo &#xff1a;将…

c++—引用。。。

目录 目录前言引用的概念交换a和b的值&#xff1a;引用作为函数的返回值常引用例子 前言 纯自学&#xff0c;看的mooc上郭老师的课&#xff0c;整理整理。。。不然全忘了。。 引用的概念 类型名&引用名某变量名&#xff1b; int&rn&#xff1b; r引用了n&#x…

服务器闰秒 linux,闰秒导致部分 Linux 服务器高 CPU 使用率

国际地球自转和参考坐标系统服务(IERS)在2012年6月30日午夜(北京时间7月1号7点59分59秒)增加一闰秒(即出现7&#xff1a;59&#xff1a;60)。由于Linux kernel 2.6.29之前版本存在bug&#xff0c;在进行闰秒调整时可能会引起系统时钟服务ntpd进程死锁。Debian Lenny、RHEL/Cent…

const

目录 目录定义常量定义常量指针定义常引用 定义常量 const int max22&#xff1b; const double p3.1415; const char* sch"zzuli"; 定义常量指针 1.不可通过常量指针修改其指向的内容 &#xff5b;常量指针指向的内容不能随意修改&#xff5d; int n,m; cons…

http header 设置编码_【译】http.client

本模块实现了HTTP和HTTPS协议的客户端功能。通常本模块不会被直接使用&#xff0c;而是被urllib.request调用&#xff0c;来处理HTTP和HTTPS相关的URL。备注&#xff1a;HTTPS只有在支持SSL(带有ssl模块)的Python编译器里面才是可用的。(一)模块提供的类class http.client.HTTP…

diskgenius linux 分区,DiskGenius怎么分区,DiskGenius分区教程

DiskGenius分区教程方法一&#xff1a;一、首先&#xff0c;打开DiskGenius软件并单击以选择要操作的硬盘驱动器。二、然后右键单击“快速分区”按钮并单击“确定”。方法2&#xff1a;三、选择要操作的硬盘&#xff0c;单击软件上方的硬盘按钮&#xff0c;单击下面列中的快速分…

new

动态内存分配 用new运算符实现动态内存分配 动态内存分配分配一个变量分配一个数组new运算符返回值类型释放动态分配出来的内存空间动态分配指针数组 分配一个变量 pnew t; t是任意类型名&#xff0c;p为类型为t*的指针。 动态分配出一片大小为sizeof(t)字节的内存空间&a…

linux系统ip占用,IP地址被占用的问题,折腾我好几天了 (已解决)

原因找到了&#xff0c;另外一台机器的网卡上面不知道怎么绑定了两个IP地址eth0 Link encap:Ethernet HWaddr 00:20:ED:1A:62:7Einet addr:192.168.0.104 Bcast:192.168.0.255 Mask:255.255.255.0inet6 addr: fe80::220:edff:fe1a:627e/64 Scope:LinkUP BROADCAST RUNN…

sql server management studio性能分析_如何分析一条SQL的性能

来自公众号&#xff1a;谭小谭这篇文章将给大家介绍如何使用 explain 来分析一条 sql 。网上其实已经有非常多的文章都很详细的介绍了 explain 的使用&#xff0c;这篇文章将实例和原理结合起来&#xff0c;尽量让你有更好的理解&#xff0c;相信我&#xff0c;认真看完你应该会…

malloc动态分配数组以及指针数组大小

对于二维数组&#xff1a;一般来说&#xff0c;当给两个数分别表示行列&#xff0c;但两个数的范围过大&#xff0c;就需要动态分配。 int i,j,m,n;scanf("%d%d",&m,&n);int **a;a(int**)malloc(sizeof(int*)*m);for(i0;i<m;i)a[i](int *)malloc(sizeof(i…

编译运行linux0.12,linux0.12 编译过程

感谢这篇文章的作者&#xff1a; http://www.cnblogs.com/strugglesometimes/p/4231359.html编译是个很蛋疼的事情&#xff0c;本想把linux0.12在bochs上跑起来然后就可以各模块的学习&#xff0c;没想各种问题。问题1&#xff1a;1 gas -c -o boot/head.o boot/head.s2 mak…

不用数组,解决众数问题(前提 :众数出现的次数必须大于n/2)

内存限制4mb 用数组不通过&#xff0c;怎么办&#xff1f; 众数出现的次数必须大于n/2 第一行输入一个整数n &#xff08;1<n<1E6) 接下来一行n个整数 mi &#xff08;1<MI<1E9) 表示第i种糖果的个数&#xff0c;整数之间用空格隔开 输出mi中出现次数最多的那…

高考python必考题目_假如高考考python编程,这些题目你会几个呢?

Python(发音&#xff1a;英[?pa?θ?n]&#xff0c;美[?pa?θɑ:n])&#xff0c;是一种面向对象、直译式电脑编程语言&#xff0c;也是一种功能强大的通用型语言&#xff0c;已经具有近二十年的发展历史&#xff0c;成熟且稳定。它包含了一组完善而且容易理解的标准库&…