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调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
python中字典dict常用操作方法实例总结
Apr 04 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
Python中常用的内置方法
Jan 28 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
sklearn+python:线性回归案例
Feb 24 Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 Python
python爬虫之爬取笔趣阁小说
Apr 22 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中Enum(枚举)用法实例详解
2015/12/07 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
用javascript操作xml
2006/11/04 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
原生js实现分页效果
2020/09/23 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
Python实现的多线程端口扫描工具分享
2015/01/21 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
Python常用特殊方法实例总结
2019/03/22 Python
五种Python转义表示法
2020/11/27 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
深入理解python多线程编程
2021/04/18 Python
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers
Hive导入csv文件示例
2022/06/25 数据库