# 异常捕获装饰器(亦可用于类方法)
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异常装饰器--比较全的版本了的更多相关文章

  1. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  2. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  3. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  4. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  5. python中装饰器的原理以及实现,

    python版本 3.6 1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循 #开放封闭原则:对修改封闭,对拓展开放 2.什么是装饰器 #装饰他人的器具,本身可以是任意可调 ...

  6. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

  7. Python的装饰器实例用法小结

    这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...

  8. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  9. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

随机推荐

  1. String.format VS. StrSubstitutor VS. NamedParameterJdbcTemplate

    在Java中,想要用一个字符串模块根据参数的不同来产生不同的字符串,主要有以下两种办法: Java String.format() 在JDK1.5中,String类新增了一个很有用的静态方法Strin ...

  2. Tensorflow图像处理

    Tensorflow图像处理主要包括:调整尺寸,图像翻转,调整色彩,处理标注框. 代码如下: #coding=utf-8 import matplotlib.pyplot as plt import ...

  3. token的理解

    今天学习了token,它的英文意思是令牌的意思.在我理解即像通行证一样,在用户登录成功系统后,会为这个用户颁发一个token,这样它去其他系统都免登录,因为有了这个令牌. token的生成我们可以用U ...

  4. Java基础-SSM之Spring的AOP编程

    Java基础-SSM之Spring的AOP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法.它是对OOP的 ...

  5. python删除列表元素remove,pop,del

    python删除列表元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me remove 删除单个元素,删除首个符合条件的元素,按值删除,返回值为空 List_remove = [1, 2, 2 ...

  6. Spark记录-Spark On YARN内存分配(转载)

    Spark On YARN内存分配(转载) 说明 按照Spark应用程序中的driver分布方式不同,Spark on YARN有两种模式: yarn-client模式.yarn-cluster模式. ...

  7. Carmichael Numbers (Uva No.10006) -- 快速幂运算_埃氏筛法_打表

    #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> ...

  8. [整理]win7下VS2010遇到内存不足解决方发

    电脑重装Win7 64bit不久后,一天内VS2010使用久了,就会出现内存不足,实际内存使用情况却不是,显示内存已使用70%.以前没有遇到过,经网上查找,貌似是VS2010对内存计算会在某些情况下计 ...

  9. [转载]DOMContentLoaded与interactive

    http://www.cnblogs.com/muxrwc/archive/2011/01/13/1934379.html ie中inline script执行时竟然第一次进入页面,doc.ready ...

  10. 如何使用ASP.NET开发基于推技术的聊天室?

    public class Content : System.Web.UI.Page{private void Page_Load(object sender, System.EventArgs e){ ...