Python重试的几种方法

没人能保证自己的的程序没BUG,所以重试非常有必要。

下面说下我知道的几种Python重试方法。

装饰器

这是最最简单的重试方法,而且有现成的轮子,推荐两个:

1. retrying

2. tenacity

两种用法比较类似,我经常用后者,看下

import random
from tenacity 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())

用法非常简单,直接加上装饰器。当然也可以有各种自定义。

from tenacity import *

@retry(stop=(stop_after_delay(10) | stop_after_attempt(5)), wait=wait_fixed(2))
def stop_after_10_s_or_5_retries():
    print("Stopping after 10 seconds or 5 retries")
    raise Exception

以上是重试5次,每次间隔10秒,重试前等待2秒。

这种方法缺点是,出现某种异常并不一定需要重试,需要根据具体情况来处理。所以下面这种方法会更适合。

捕获异常

这种方法更常见

def func():
    pass

for _ in range(0,100):
    while True:
        try:
            func()
        except SomeSpecificException:
            continue
        break

这里一定不要写成`except`或者`except Exception`,一定要指定异常,让别的错误打印出来,然后看日志再修改爬虫,会出现意想不到的情况。

举一个例:

def verify_url(url):
    import requests
    try:
        requests.get(url, timeout=10)
        return True
    except requests.exceptions.ConnectTimeout:
        return False


def main():
    for _ in range(5):
        try:
            if verify_url(''):
                return
            else:
                continue
        except KeyError:
            continue


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值