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字典的常用操作方法小结
May 16 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
使用python实现knn算法
Dec 20 Python
Python之web模板应用
Dec 26 Python
pyqt5自定义信号实例解析
Jan 31 Python
简单了解python的内存管理机制
Jul 08 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
Django后台管理系统的图文使用教学
Jan 20 Python
Python实现对adb命令封装
Mar 06 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
通过实例解析python subprocess模块原理及用法
Oct 10 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
建立动态的WML站点(一)
2006/10/09 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
jquery validate demo 基础
2015/10/29 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
python add_argument()用法解析
2020/01/29 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
python sleep和wait对比总结
2021/02/03 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
医院标语大全
2014/06/23 职场文书
2015年学校体育工作总结
2015/04/22 职场文书