Python中异常重试的解决方案详解


Posted in Python onMay 05, 2017

前言

大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理。

原先的流程:

def crawl_page(url):
 pass
 
def log_error(url):
 pass
 
url = ""
try:
 crawl_page(url)
except:
 log_error(url)

改进后的流程:

attempts = 0
success = False
while attempts < 3 and not success:
 try:
  crawl_page(url)
  success = True
 except:
  attempts += 1
  if attempts == 3:
   break

最近发现的新的解决方案:retrying

retrying是一个 Python的重试包,可以用来自动重试一些可能运行失败的程序段。retrying提供一个装饰器函数retry,被装饰的函数就会在运行失败的条件下重新执行,默认只要一直报错就会不断重试。

import random
from retrying import retry
 
@retry
def do_something_unreliable():
 if random.randint(0, 10) > 1:
  raise IOError("Broken sauce, everything is hosed!!!111one")
 else:
  return "Awesome sauce!"
 
print do_something_unreliable()

如果我们运行have_a_try函数,那么直到random.randint返回5,它才会执行结束,否则会一直重新执行。

retry还可以接受一些参数,这个从源码中Retrying类的初始化函数可以看到可选的参数:

  • stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就停止重试
  •  stop_max_delay:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了
  • wait_fixed:设置在两次retrying之间的停留时间
  • wait_random_min和wait_random_max:用随机的方式产生两次retrying之间的停留时间
  • wait_exponential_multiplier和wait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplierprevious_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max。这个设计迎合了exponential backoff算法,可以减轻阻塞的情况。
  • 我们可以指定要在出现哪些异常的时候再去retry,这个要用retry_on_exception传入一个函数对象:
def retry_if_io_error(exception):
 return isinstance(exception, IOError)
 
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
 with open("file", "r") as f:
  return f.read()

在执行read_a_file函数的过程中,如果报出异常,那么这个异常会以形参exception传入retry_if_io_error函数中,如果exceptionIOError那么就进行retry,如果不是就停止运行并抛出异常。

我们还可以指定要在得到哪些结果的时候去retry,这个要用retry_on_result传入一个函数对象:

def retry_if_result_none(result):
 return result is None
 
@retry(retry_on_result=retry_if_result_none)
def get_result():
 return None

在执行get_result成功后,会将函数的返回值通过形参result的形式传入retry_if_result_none函数中,如果返回值是None那么就进行retry,否则就结束并返回函数值。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
python机器人运动范围问题的解答
Apr 29 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
Python中的 ansible 动态Inventory 脚本
Jan 19 Python
Python中私有属性的定义方式
Mar 05 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
使用Django实现商城验证码模块的方法
Jun 01 Python
Python与C++中梯度方向直方图的实现
Mar 17 Python
Django的信号机制详解
May 05 #Python
Python中模块与包有相同名字的处理方法
May 05 #Python
详解python 字符串和日期之间转换 StringAndDate
May 04 #Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 #Python
python 统计代码行数简单实例
May 04 #Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 #Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 #Python
You might like
PHP学习 变量使用总结
2011/03/24 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
wxPython窗口的继承机制实例分析
2014/09/28 Python
简单介绍Python中的decode()方法的使用
2015/05/18 Python
使用python3.5仿微软记事本notepad
2016/06/15 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
药学专业学生的自我评价分享
2014/02/06 职场文书
《尊严》教学反思
2014/02/11 职场文书
小学生操行评语大全
2014/04/22 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
上班旷工检讨书
2015/08/15 职场文书
如何写好开幕词?
2019/06/24 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
Mysql MVCC机制原理详解
2021/04/20 MySQL
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python