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: 被装饰函数的执行结果。
- """
- # 带参数的装饰器
- def decorator(func):
- @functools.wraps(func)
- def wrapper(*args, **kwargs):
- # nonlocal delay, step, max_retries
- i = 0
- func_exc, exc_traceback = StopRetry, None
- while i < max_retries:
- try:
- result = func(*args, **kwargs)
- # 验证函数返回False时,表示告知装饰器验证不通过,继续重试
- if callable(validate) and validate(result) is False:
- continue
- else:
- return result
- except exceptions as ex:
- func_exc, exc_traceback = ex, traceback.format_exc()
- # 处理函数返回True时,表示告知装饰器异常已经处理,终止重试
- if callable(process):
- try:
- if process(ex) is True:
- return default() if callable(default) else default
- except Exception as e:
- func_exc, exc_traceback = e, traceback.format_exc()
- break
- finally:
- i += 1
- sleep(delay + step * i)
- else:
- # 回调函数,处理自动无法处理的异常
- if callable(callback):
- callback(func_exc, exc_traceback)
- return default() if callable(default) else default
- pass
- return wrapper
- if callable(f):
- return decorator(f)
- return decorator
python异常装饰器--比较全的版本了的更多相关文章
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- 详解Python的装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- python中装饰器的原理以及实现,
python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...
- Python之装饰器、迭代器和生成器
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...
- Python的装饰器实例用法小结
这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
随机推荐
- ASP.NET MVC 此安装不支持该项目类型解决方法
http://www.cnblogs.com/younggun/archive/2011/03/03/1969498.html ASP.NET MVC 此安装不支持该项目类型解决方法 打开 .csp ...
- Zabbix应用六:Zabbix监控Redis
利用Zabbix监控Redis Zabbix监控redis就比较简单了,因为zabbix官方提供了监控redis的模版和脚本,而且脚本有nodejs和python两种,下载地址:https://git ...
- faster rcnn 详解
转自:https://zhuanlan.zhihu.com/p/31426458 经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN ...
- mybatis+sqlserver中返回非自增主键
首先把实体类贴出来(这里只贴出属性,其它的就是getter和setter方法): public class Around { private String xccd; //对应主键 ...
- js基础回顾
值类型:值的拷贝. 引用类型:一般指对象,地址的指针引用 typeof有几种类型:6种 变量和布尔值之间的转换 js中内置的函数
- js拾遗: replace 替换参数
先来看一个简单的例子吧. var str = "123X321".replace("X", "$'"); 替换后的 str 是什么呢?是 & ...
- javascript 简单工厂模式
var Bicycle = new Interface("Bicycle",["assemble","wash","ride&qu ...
- 【51Nod】1519 拆方块 贪心+递推
[题目]1519 拆方块 [题意]给定n个正整数,\(A_i\)表示第i堆叠了\(A_i\)个石子.每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除.\(n \leq 10^5\). [算法 ...
- 第11月第18天 RACSequence
1. RACSequence的内部存储结构就像一个单链表,有两个指针head和tail,head指针指向了当前链表的第一个元素,tail指向head指针下一个元素:根据RACSequence是否还有内 ...
- oracle锁表查询,资源占用,连接会话,低效SQL等性能检查
查询oracle用户名,机器名,锁表对象 select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user ...