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实现截屏的函数
Jul 26 Python
利用Python获取操作系统信息实例
Sep 02 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
python 把列表转化为字符串的方法
Oct 23 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
pycharm安装及如何导入numpy
Apr 03 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
python 自动识别并连接串口的实现
Jan 19 Python
Python预测分词的实现
Jun 18 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
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
js 页面输出值
2008/11/30 Javascript
JQuery live函数
2010/12/24 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
深入浅析python继承问题
2016/05/29 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
Python2手动安装更新pip过程实例解析
2020/07/16 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
工艺工程师工作职责
2013/11/23 职场文书
个人求职信范文分享
2014/01/06 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
公诉意见书范文
2015/06/05 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python