必威体育Betway必威体育官网
当前位置:首页 > IT技术

Python学习之------retry(异常重试)

时间:2019-07-25 01:11:08来源:IT技术作者:seo实验室小编阅读:56次「手机版」
 

retry

在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理。

原先的流程:

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类的初始化函数可以看到可选的参数:

1、stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就停止重试

2、stop_max_delay:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了

3、wait_fixed:设置在两次retrying之间的停留时间

4、wait_random_minwait_random_max:用随机的方式产生两次retrying之间的停留时间

5、wait_exponential_multiplierwait_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,否则就结束并返回函数值。

其他相关资料:

https://pypi.python.org/pypi/retry/

https://julien.danjou.info/blog/2015/python-retrying

https://github.com/rholder/retrying

原文:https://www.biaodianfu.com/python-error-retry.html

相关阅读

Python能用来做什么?这3大主要用途你一定要知道!

导读:如果你想学Python,或者你刚开始学习Python,那么你可能会问:“我能用Python做什么?”这个问题不好回答,因为Python有很多用途。但是

Perl下载和安装&Python下载和安装

Perl下载地址:http://strawberryperl.com/http://strawberryperl.com/Perl安装方式:https://jingyan.baidu.com/article/9f7e7ec0b7

相关系数矩阵与热力图heatmap(Python高级可视化库seab

相关系数矩阵 通常,样本是由多维特征的构成的,把每个特征维度都看成一个随机变量,为了考查两两特征间的关系,可以借助随机变量的协方

Python 20行简单实现有道在线翻译

转载请注明出处 目录 目录 简介 代码 重要函数 简介 主要是尝试简单的使用pyhton的爬虫功能,于是使用有道进行尝

python基于共现的《红楼梦》人物关系图

作为中国古典四大名著,《红楼梦》的影响深远,至今家喻户晓。历来红学家们都在研究《红楼梦》。最近受python自然语言处理的影响,突然

分享到:

栏目导航

推荐阅读

热门阅读