Python异常重试解决方案 Python中异常重试的解决方案详解
前言
大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理。
原先的流程:
def crawl_page(url):passdef log_error(url):passurl = ""
try:crawl_page(url)
except:log_error(url)
改进后的流程:
attempts = 0
success = False
while attempts < 3 and not success:try:crawl_page(url)success = Trueexcept:attempts += 1if 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_multiplier
,previous_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
函数中,如果exception
是IOError
那么就进行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中异常重试的解决方案详解相关推荐
- python迭代器创建序列_Python 中迭代器与生成器实例详解
Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的 ...
- python getopt_python 5种 statsPython中的getopt函数使用详解
函数原型: getopt.getopt(args, shortopts, longopts=[]) 参数解释: args:args为需要解析的参数列表.一般使用sys.argv[1:],这样可以过滤掉 ...
- python获取键盘按键_Python中捕获键盘的方式详解
python中捕获键盘操作一共有两种方法 第一种方法: 使用pygame中event方法 使用方式如下:使用键盘右键为例 if event.type = pygame.KEYDOWN and even ...
- python decimal类型转化_python中的decimal类型转换实例详解
[Python标准库]decimal--定点数和浮点数的数学运算 作用:使用定点数和浮点数的小数运算. Python 版本:2.4 及以后版本 decimal 模块实现了定点和浮点算术运算符,使用的是 ...
- python的count函数_python中count函数的用法详解
python中count函数的用法 count()函数 描述:统计字符串里某个字符出现的次数,可以选择字符串索引的起始位置和结束位置. 语法:str.count("char", s ...
- python编程顺序_Python编程中归并排序算法的实现步骤详解
基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止.然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元 ...
- python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解
我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...
- python编程字典100例_python中字典(Dictionary)用法实例详解
本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...
- Python中的select、epoll详解
Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...
- python中为什么推荐使用with_Python中的with关键字使用详解
这篇文章主要介绍了Python 中的with关键字使用详解的相关资料,在Python中,with关键字是一个替你管理实现上下文协议对象的好东西,需要的朋友可以参考下 "> 在 Pyth ...
最新文章
- hadoop作业初始化过程详解(源码分析第三篇)
- Gzip 服务端压缩数据
- 【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边
- EF获取多个数据集以及MySQL分页数据查询优化
- 多分支集成发布各种坑怎么填?
- mysql ssd优化_mysql ssd 优化
- 编译异常例子java_Java中异常发生时代码执行流程
- 基于SSM实现的旅游管理系统【附源码】(毕设)
- 教你查看预装Win8电脑内置系统激活密钥(Win8 OEM Key)
- R语言plotly可视化:使用plotly可视化模型预测概率值的直方图、使用分类标签为阴性和阳性样本预测概率直方图进行颜色区分(prediction probability histogram)
- 解决win10小娜无法搜索本地应用程序
- 运单状态机设计及全流程异常跟踪整体架构
- 电机控制基础知识储备
- 求π的值C++--递归求阶乘、浮点数精度控制技巧
- Apache Ignite详解
- 字符串--Leetcode (python)
- jquery事件代理
- C++实现Python变量
- 我们都需要时间,成为更好的人(转载)
- TypeScript 使用手册