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中的关键字“with”与上下文管理器
Apr 21 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
Python的pygame安装教程详解
Feb 10 Python
python实现udp聊天窗口
Mar 31 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 Python
Python&Matlab实现灰狼优化算法的示例代码
Mar 21 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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中使用Oracle数据库(3)
2006/10/09 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
php实现图片压缩处理
2020/09/09 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python使用py2exe打包程序介绍
2014/11/20 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python实战之实现excel读取、统计、写入的示例讲解
2018/05/02 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
中国医药集团国药在线:国药网
2017/02/06 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
家长给孩子的表扬信
2014/01/17 职场文书
2014年医生工作总结
2014/11/21 职场文书
财务经理岗位职责
2015/01/31 职场文书
研讨会通知
2015/04/27 职场文书
关于EntityWrapper的in用法
2022/03/22 Java/Android
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers