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转换摩斯密码示例
Feb 16 Python
python使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
Python中DJANGO简单测试实例
May 11 Python
Python中random模块用法实例分析
May 19 Python
python图书管理系统
Apr 05 Python
python实现抖音视频批量下载
Jun 20 Python
python实现推箱子游戏
Mar 25 Python
ubuntu上安装python的实例方法
Sep 30 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
python 爬虫如何正确的使用cookie
Oct 27 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 IP转换整形(ip2long)的详解
2013/06/06 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
js 控制图片大小核心讲解
2013/10/09 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
图文详解WinPE下安装Python
2016/05/17 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python将数组n等分的实例
2019/12/02 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
用 python 进行微信好友信息分析
2020/11/28 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
年度考核自我鉴定
2014/02/02 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
计算机网络专业求职信
2014/06/05 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
会议开幕词
2015/01/28 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
安全生产培训心得体会
2016/01/18 职场文书
Python socket如何解析HTTP请求内容
2022/02/12 Python
python 安全地删除列表元素的方法
2022/03/16 Python