Python中异常重试的解决方案详解

579次阅读  |  发布于5年以前

前言

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

原先的流程:


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


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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8