1. # 异常捕获装饰器(亦可用于类方法)
  2. def try_except_log(f=None, max_retries: int = 5, delay: (int, float) = 1, step: (int, float) = 0,
  3. exceptions: (BaseException, tuple, list) = BaseException, sleep=time.sleep,
  4. process=None, validate=None, callback=None, default=None):
  5. """
  6. 函数执行出现异常时自动重试的简单装饰器
  7. :param f: function 执行的函数。
  8. :param max_retries: int 最多重试次数。
  9. :param delay: int/float 每次重试的延迟,单位秒。
  10. :param step: int/float 每次重试后延迟递增,单位秒。
  11. :param exceptions: BaseException/tuple/list 触发重试的异常类型,单个异常直接传入异常类型,多个异常以tuple或list传入。
  12. :param sleep: 实现延迟的方法,默认为time.sleep。
  13. 在一些异步框架,如tornado中,使用time.sleep会导致阻塞,可以传入自定义的方法来实现延迟。
  14. 自定义方法函数签名应与time.sleep相同,接收一个参数,为延迟执行的时间。
  15. :param process: 处理函数,函数签名应接收一个参数,每次出现异常时,会将异常对象传入。
  16. 可用于记录异常日志,中断重试等。
  17. 如处理函数正常执行,并返回True,则表示告知重试装饰器异常已经处理,重试装饰器终止重试,并且不会抛出任何异常。
  18. 如处理函数正常执行,没有返回值或返回除True以外的结果,则继续重试。
  19. 如处理函数抛出异常,则终止重试,并将处理函数的异常抛出。
  20. :param validate: 验证函数,用于验证执行结果,并确认是否继续重试。
  21. 函数签名应接收一个参数,每次被装饰的函数完成且未抛出任何异常时,调用验证函数,将执行的结果传入。
  22. 如验证函数正常执行,且返回False,则继续重试,即使被装饰的函数完成且未抛出任何异常。
  23. 如验证函数正常执行,没有返回值或返回除False以外的结果,则终止重试,并将函数执行结果返回。
  24. 如验证函数抛出异常,且异常属于被重试装饰器捕获的类型,则继续重试。
  25. 如验证函数抛出异常,且异常不属于被重试装饰器捕获的类型,则将验证函数的异常抛出。
  26. :param callback: 回调函数,函数签名应接收一个参数,异常无法处理时,会将异常对象传入。
  27. 可用于记录异常日志,发送异常日志等。
  28. :param default: 默认值/默认值生成函数
  29. :return: 被装饰函数的执行结果。
  30. """
  31.  
  32. # 带参数的装饰器
  33. def decorator(func):
  34. @functools.wraps(func)
  35. def wrapper(*args, **kwargs):
  36. # nonlocal delay, step, max_retries
  37. i = 0
  38. func_exc, exc_traceback = StopRetry, None
  39. while i < max_retries:
  40. try:
  41. result = func(*args, **kwargs)
  42. # 验证函数返回False时,表示告知装饰器验证不通过,继续重试
  43. if callable(validate) and validate(result) is False:
  44. continue
  45. else:
  46. return result
  47. except exceptions as ex:
  48. func_exc, exc_traceback = ex, traceback.format_exc()
  49. # 处理函数返回True时,表示告知装饰器异常已经处理,终止重试
  50. if callable(process):
  51. try:
  52. if process(ex) is True:
  53. return default() if callable(default) else default
  54. except Exception as e:
  55. func_exc, exc_traceback = e, traceback.format_exc()
  56. break
  57. finally:
  58. i += 1
  59. sleep(delay + step * i)
  60. else:
  61. # 回调函数,处理自动无法处理的异常
  62. if callable(callback):
  63. callback(func_exc, exc_traceback)
  64. return default() if callable(default) else default
  65. pass
  66.  
  67. return wrapper
  68.  
  69. if callable(f):
  70. return decorator(f)
  71. 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. ASP.NET MVC 此安装不支持该项目类型解决方法

    http://www.cnblogs.com/younggun/archive/2011/03/03/1969498.html ASP.NET MVC  此安装不支持该项目类型解决方法 打开 .csp ...

  2. Zabbix应用六:Zabbix监控Redis

    利用Zabbix监控Redis Zabbix监控redis就比较简单了,因为zabbix官方提供了监控redis的模版和脚本,而且脚本有nodejs和python两种,下载地址:https://git ...

  3. faster rcnn 详解

    转自:https://zhuanlan.zhihu.com/p/31426458 经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN ...

  4. mybatis+sqlserver中返回非自增主键

    首先把实体类贴出来(这里只贴出属性,其它的就是getter和setter方法): public class Around {     private String xccd;  //对应主键      ...

  5. js基础回顾

    值类型:值的拷贝. 引用类型:一般指对象,地址的指针引用 typeof有几种类型:6种 变量和布尔值之间的转换 js中内置的函数

  6. js拾遗: replace 替换参数

    先来看一个简单的例子吧. var str = "123X321".replace("X", "$'"); 替换后的 str 是什么呢?是 & ...

  7. javascript 简单工厂模式

    var Bicycle = new Interface("Bicycle",["assemble","wash","ride&qu ...

  8. 【51Nod】1519 拆方块 贪心+递推

    [题目]1519 拆方块 [题意]给定n个正整数,\(A_i\)表示第i堆叠了\(A_i\)个石子.每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除.\(n \leq 10^5\). [算法 ...

  9. 第11月第18天 RACSequence

    1. RACSequence的内部存储结构就像一个单链表,有两个指针head和tail,head指针指向了当前链表的第一个元素,tail指向head指针下一个元素:根据RACSequence是否还有内 ...

  10. oracle锁表查询,资源占用,连接会话,低效SQL等性能检查

    查询oracle用户名,机器名,锁表对象 select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user ...