在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理。
原先的流程:
- 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()
如果我们运行 haveatry 函数,那么直到 random.randint 返回 5,它才会执行结束,否则会一直重新执行。
retry 还可以接受一些参数,这个从源码中 Retrying 类的初始化函数可以看到可选的参数:
我们可以指定要在出现哪些异常的时候再去 retry,这个要用 retryonexception 传入一个函数对象:
- 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()
在执行 readafile 函数的过程中,如果报出异常,那么这个异常会以形参 exception 传入 retryifio_error 函数中,如果 exception 是 IOError 那么就进行 retry,如果不是就停止运行并抛出异常。
我们还可以指定要在得到哪些结果的时候去 retry,这个要用 retryonresult 传入一个函数对象:
- def retry_if_result_none(result):
- return result is None
- @retry(retry_on_result=retry_if_result_none)
- def get_result():
- return None
在执行 getresult 成功后,会将函数的返回值通过形参 result 的形式传入 retryifresultnone 函数中,如果返回值是 None 那么就进行 retry,否则就结束并返回函数值。
其他相关资料:
分享题目:Python中异常重试解决方案
本文URL:http://www.shufengxianlan.com/qtweb/news20/356520.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联