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制作CSDN免积分下载器
Mar 10 Python
分享vim python缩进等一些配置
Jul 02 Python
python判断输入日期为第几天的实例
Nov 13 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
解决python 文本过滤和清理问题
Aug 28 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
python实现FTP循环上传文件
Mar 20 Python
基于python生成英文版词云图代码实例
May 16 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
python是怎么被发明的
Jun 15 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
javascript 小型动画组件与实现代码
2010/06/02 PHP
php对称加密算法示例
2014/05/07 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Javascript 面向对象特性
2009/12/28 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
Python 字符串中的字符倒转
2008/09/06 Python
Python3中的json模块使用详解
2018/05/05 Python
Python Grid使用和布局详解
2018/06/30 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
对Django url的几种使用方式详解
2019/08/06 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
python中wx模块的具体使用方法
2020/05/15 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
英国家电直销:Appliances Direct
2016/09/22 全球购物
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
综合实践活动方案
2014/02/14 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书