如何提高 python 程序代码的健壮性 | python 系列

在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等。这些不确定性会让我们的程序容易出现各种错误和异常。那么如何来增加程序的容错性和健壮性呢?

可能大多数人会想到使用 try except 来进行异常捕捉进行失败重试 (Retry)。虽然 try-escept 一个非常常见和有效的方式来增强程序稳定性,但是可能一不小心就会造成栈溢出。

所以接下来我就来介绍一个另外的一个专门用于失败重试的库:retrying。

定义

在 Python 生态中,retrying 库提供了非常便捷的装饰器和函数来帮助我们轻松添加失败重试机制。它可以自定义重试策略、停止条件、等待间隔等,对各种异常进行捕捉处理。使用 retrying 可以大大减少我们重复编写失败重试轮询的代码量。

1.下载 retrying

pip install retrying

2.无参数重试

我们可以直接在函数上使用装饰器_<_a href=“https://testerhome.com/retry”>@retry来进行失败重试

import retrying
@retry
def func():
    for item in range(0,100):
        result=item / 0
        print(result)
        return result

func()

但是这种方式并不建议使用,就像上面的代码,我们都知道 0 作为除数就会报错,在上面的 func 函数中,因为加了_<_a href=“https://testerhome.com/retry”>@retry装饰器进行失败重试,这样就就会进入一个死循环一直失败一直重试。

所以我们在进行失败重试的时候最好是需要加上一些参数来限制失败重试。

3.有参数重试

(1)stop_max_attempt_number

在 retry 中传入 stop_max_attempt_number 参数后可以指定失败重试的次数

@retry(stop_max_attempt_number=2)
def func():
    print(f"记录失败重试")
    for item in range(0,100):
        result=item / 0
        print(result)
        return result

func()

因为这里我们指定了失败后进行两次重试,如果重试执行两次后还是报错则结束重试,将错误信息抛出来。

(2)wait_fixed 传入 wati_fixed 后,可以指定重试的时间

from retrying import retry
import time

# 设置三秒重试一次
@retry(wait_fixed=3000)  
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0
    print(result)
    return result

func()

配置重试间隔时间后,成语遇到执行失败或者报错后,就会根据设置的重试时间去进行重试执行

(3)wait_random_min 和 wait_random_max

通常 wait_random_min 和 wait_random_max 是一起搭配使用的,可以设置一个重试等待的时间,然后会在设置的时间区间内随机取一个等待时间进行重试

from retrying import retry
import time


@retry(wait_random_min=1000,wait_random_max=9000)
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0
    print(result)
    return result

func()

(4)wait_exponential_multiplier 和 wait_exponential_max

官方解释为:以指数的形式产生两次 retrying 之间的停留时间, 产生的值为 2previous_attempt_number * wait_exponential_multiplier, previous_attempt_number 是前面已经 retry 的次数, 如果产生的这个值超过了 wait_exponential_max 的大小, 那么之后两个 retrying 之间的停留值都为 wait_exponential_max

通俗来点讲就是每次重试的时间以 wait_exponential_multiplier 设置的值 2,如果重试后还是失败则继续 2,直到最后的值等于或则超过 wait_exponential_max 设置的值后,后面的每一次重试等待时间都是 wait_exponential_max 设置的值

from retrying import retry
import time

@retry(wait_exponential_multiplier=1000,wait_exponential_max=10000)
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0
    print(result)
    return result

func()

(5) wait_func

在前面介绍的参数都是如何配置失败冲重试的等待时间或者重试次数之类的,但是我们不能时时刻刻盯着程序,在程序代码发生错误时我们应该要进行发送短信或者邮件之类的提醒才行

在这里就可以使用到 wait_func 参数,它接收一个可执行函数,返回一个具体的间隔时间数值,单位 ms。接收的函数须接收两个参数:attempt_number 当前运行次数,delay_since_first_attempt_ms 当前重试机制运行时间 (单位 ms)

from retrying import retry
import time


def func_demo(attempt_number,delay_since_first_attempt_ms):
    print("函数运行失败后运行该函数")

    if attempt_number == 5:
        print("已经重试失败五次了,开始准备发送提醒")

    if attempt_number == 10:
        print("已经重试失败超10次了,发送邮件给相关人员紧急处理")

    if attempt_number >10:
        print("重试时间过长,做一些其他临时方案进行补救")

    # return一个重试的时间
    return 2000


@retry(wait_func=func_demo)
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0

    return result

func()

使用 wait_func 通过调用其他可执行的函数,我们可以借助它来做一些临时的补救措施,避免程序一直无法运行而产生的影响。

(6)其他参数

在 retry 中还存在有很多参数,有兴趣的小伙伴可以去详细了解下

  • stop_max_attempt_number:在停止之前尝试的最大次数,最后一次如果还是有异常则会抛出异常,停止运行,默认为 5 次
  • stop_max_delay:最大延迟时间,大概意思就是:如果调用的函数出现异常,那么就会重复调用这个函数,最大调用时间,默认为 100 毫秒
  • wait_fixed:两次调用方法期间停留时长, 如果出现异常则会一直重复调用,默认 1000 毫秒
  • wait_random_min:在两次调用方法停留时长,停留最短时间,默认为 0
  • wait_random_max:在两次调用方法停留时长,停留最长时间,默认为 1000 毫秒
  • wait_incrementing_increment:每调用一次则会增加的时长,默认 100 毫秒
  • wait_exponential_multiplier 和 wait_exponential_max:以指数的形式产生两次「retrying」之间的停留时间,产生的值为 2previous_attempt_number * wait_exponential_multiplier,previous_attempt_number 是前面已经「retry」的次数,如果产生的这个值超过了 wait_exponential_max 的大小,那么之后两个「retrying」之间的停留值都为 wait_exponential_max
  • retry_on_exception: 指定一个函数,如果此函数返回指定异常,则会重试,如果不是指定的异常则会退出
  • retry_on_result:指定一个函数,如果指定的函数返回 True,则重试,否则抛出异常退出
  • wrap_exception:参数设置为 True/False,如果指定的异常类型,包裹在 RetryError 中,会看到 RetryError 和程序抛的 Exception error
  • stop_func: 每次抛出异常时都会执行的函数,如果和 stop_max_delay、stop_max_attempt_number 配合使用,则后两者会失效 (指定的 stop_func 会有两个参数:attempts, delay)
  • wait_func:和 stop_func 用法差不多。

以上就是“如何提高 python 程序代码的健壮性 | python 系列”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值