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 应用中使用 MongoDB的方法
Jan 05 Python
浅谈python 线程池threadpool之实现
Nov 17 Python
实践Vim配置python开发环境
Jul 02 Python
python爬虫超时的处理的实例
Dec 19 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
Python多线程爬取豆瓣影评API接口
Oct 22 Python
python的slice notation的特殊用法详解
Dec 27 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
Jan 18 Python
Python 实现向word(docx)中输出
Feb 13 Python
基于Django集成CAS实现流程详解
Nov 28 Python
python 经纬度求两点距离、三点面积操作
Jun 03 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 session_start()出错原因分析及解决方法
2013/10/28 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
如何基于python操作json文件获取内容
2019/12/24 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
公司年会主持词
2014/03/22 职场文书
期末考试复习计划
2015/01/19 职场文书
2016十一国庆节感言
2015/12/09 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
2021/03/29 PHP
Python anaconda安装库命令详解
2021/10/16 Python
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python