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

2023-12-05


概要

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

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

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


定义

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

1.下载retrying

pip install retrying

2.无参数重试

我们可以直接在函数上使用装饰器 @retry 来进行失败重试

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

func()

但是这种方式并不建议使用,就像上面的代码,我们都知道0作为除数就会报错,在上面的func函数中,因为加了 @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()

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

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

(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()

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

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

(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()

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

(4) wait_exponential_multiplier wait_exponential_max

官方解释为:以指数的形式产生两次retrying之间的停留时间, 产生的值为2^previous_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()

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

(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()

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

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

(6)其他参数

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

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 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」之间的停留时间,产生的值为2^previous_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用法差不多。

本次的分享就到这里,喜欢的小伙伴记得点赞转发关注,感谢~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python系列:如何提高python程序代码的健壮性 的相关文章

随机推荐

  • InterLM代码解析

    interLM的Transformer架构 重要模块的实现解析 Decoder架构 class InternLMDecoderLayer nn Module def init self config InternLMXComposerCon
  • 服务器托管与服务器租用的详细比较

    在当今数字化时代 服务器托管和服务器租用成为了许多企业和个人选择的两种常见方式 它们都提供了一种将服务器放置在专业机房中的解决方案 但在具体实施和使用过程中存在一些差异 下面将详细比较这两种方式的优势和劣势 1 服务器托管 服务器托管是指用
  • 详解Spring中的Profile

    详解Spring中的Profile 一 前言 二 Spring中的Profile 是什么 三 配置Spring profile 3 1 例子需要的Maven依赖 3 2 例子代码 四 激活Profile的其他几种方式 一 前言 由于在项目中
  • 赚了!用Python兼职,月赚49K!

    大家好 先说个冷知识 现在业界对Python技术服务的需求量正在暴涨 当下早已供不应求 且有愈演愈烈的趋势 极不平衡的供需关系 使Python兼职的价格变得极高 几乎所有的Python圈内人 都在利用Python写代码接私活赚钱 近期Pyt
  • 【uniapp】小程序中input输入框的placeholder-class不生效解决办法

    问题描述 uniapp微信小程序 使用input组件时 想要改变提示词 placeholder 的样式 但是使用 placeholder class 改变不了 如下
  • 光环云与亚马逊云科技成功举办“合作伙伴成长峰会:赋能与共赢”活动

    光环云作为由光环新网和西云数据所提供的亚马逊云科技中国区域推广计划的授权增值推广商 致力于帮助中国企业更加方便 高效 安全地享受亚马逊云科技云服务 加速数字化转型 2023年11月29日 光环云携手亚马逊云科技和商礼科技成功举办 合作伙伴成
  • Linux 编译安装colmap

    COLMAP可以作为独立的app 通过命令行或者图形交互界面使用 也可以作为一个库被包含到其他源代码中 这里记录一下编译安装colmap的过程 首先需要安装好CUDA CUDA具体安装过程这里就不赘述了 在GitHub上下载源代码 我这里就
  • VIM使用快捷键快速移动到某个位置

    光标移动到行首 行首没有空格 光标移动到行首 行首有空格 数字0 光标移动到行尾 移动到指定行 7G 数字加一个大G 光标移动到文件开始 gg 两个小g 光标移动到文件末尾 G 一个大G 窗口向上滚动一行 Ctrl e scroll up
  • mapbox实现点选要素

    成果图 核心代码 核心逻辑就是指定一个唯一的高亮要素对象 全图监听点击事件 通过queryRenderedFeatures鼠标点拿到要素的id 然后将要素的状态改为选中 这样选中的要素的样式就会改为我们设置好的选中的样式 记住这个高亮对象
  • Gazebo 中为地面和车轮添加摩擦属性

    Gazebo 中为地面和车轮添加摩擦属性 Link friction properties not applied from URDF to Gazebo SDFormat Specification Adding friction to
  • 无尘车间等级划分标准

    在制造业 医药行业 食品行业等领域中 无尘车间是一个非常重要的组成部分 无尘车间能够提供清洁 高度控制的环境 有利于产品质量的提高和生产过程的优化 SICOLAB喜格 将详细介绍无尘车间的等级划分标准 包括其定义 方法和重要性 一 无尘车间
  • Matlab中文注释在Linux中乱码解决

    Linux for Matlab中文注释乱码 Linux for Matlab中文注释乱码 亲测有效 中文注释乱码的原因是windows下的m文件采用的是gbk编码 只要将所有的m文件转成 utf8文件 显示就正常了 查看支持的语言 enc
  • Linux系列-1 Linux启动流程——init与systemd进程

    背景 最近对所有项目完成了一个切换 服务管理方式由 init gt systemd 对相关知识进行总结一下 1 启动流程 服务器的整体启动流程如下图所示 POST 计算机通电后进行POST Power On Self Test 加电自检 检
  • C#8.0本质论第十六章--使用查询表达式的LINQ

    C 8 0本质论第十六章 使用查询表达式的LINQ 像SQL这样的专业查询语言虽然容易阅读和理解 但又缺乏C 语言的完整功能 这正是C 语言设计者在C 3 0中添加 查询表达式 语法的原因 本章大部分都类似于SQL 一般不会使用到 在用到的
  • python能用来做什么?这3大主要用途你一定要知道!(实用)_python能做什么

    导读 如果你想学Python 或者你刚开始学习Python 那么你可能会问 我能用Python做什么 这个问题不好回答 因为Python有很多用途 但是随着时间 我发现有Python主要有以下三大主要应用 Web开发 数据科学 包括机器学习
  • 无尘车间装修要符合哪些要求

    无尘车间装修是工业生产中非常重要的一环 它能够提供高度洁净的生产环境 保证产品在生产过程中的质量和安全性 因此 无尘车间的装修设计必须符合一系列要求 以确保其使用效果和性能达到最佳状态 SICOLAB喜格 将详细介绍无尘车间装修要符合哪些要
  • 学会Python怎么找兼职?

    当今收入低于5000的人至少占到40 完全不够养活一家人 而且很多小伙伴其实空余时间比较多 特别是大学生 零花钱又不够花 都想靠业余时间找点轻松的活增加收入 但是缺没门路 为此结合我多年编程开发经验 总结了几种用Python赚外快的方法 最
  • Mybatis简介

    1 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis 2010年6月这个项目由Apache Software Foundation迁移到了Google Code 随着开发团队转投Google Code旗下 iB
  • 光纤和光模块的那点事儿

    你们好 我的网工朋友 应该不少朋友在工作中会遇到光纤传输布线的活吧 不得不说 会遇上的问题还挺多 比如说 光纤收发器怎么接上不亮 光纤收发器和交换机插光模块能不能搭配使用 带光口的球机可以和交换机搭配使用吗 这些你都懂多少 这篇文章 和你聊
  • Python系列:如何提高python程序代码的健壮性

    概要 在编程的时候 我们难免会遇到一些不可靠的情况 比如网络请求失败 数据库连接超时等等 这些不确定性会让我们的程序容易出现各种错误和异常 那么如何来增加程序的容错性和健壮性呢 可能大多数人会想到使用try except来进行异常捕捉进行失