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解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
PyQt5响应回车事件的方法
Jun 25 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
基于Python的Jenkins的二次开发操作
May 12 Python
基于plt.title无法显示中文的快速解决
May 16 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
Python读写csv文件流程及异常解决
Oct 20 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
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php中使用websocket详解
2016/09/23 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
解密效果
2006/06/23 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
python实现C4.5决策树算法
2018/08/29 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
python Kmeans算法原理深入解析
2019/08/23 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
在线服装零售商:SheIn
2016/07/22 全球购物
计算机开发个人求职信范文
2013/09/26 职场文书
信息工程学院毕业生推荐信
2013/11/05 职场文书
入党自我鉴定
2014/03/25 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
奖励通知
2015/04/22 职场文书
运动会宣传稿50字
2015/07/23 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js