Python错误处理的艺术:使用retrying库实现高效重试机制

2023-11-19

简介

学习如何使用 Python 的 retrying 库来处理在程序运行过程中可能出现的各种异常和错误。
retrying 是一种简单、易于使用的重试机制,帮助我们处理由网络问题或其他暂时性错误引起的失败。在很多情况下,简单的重试可能就是解决问题的最好方式。通过本篇博客,你将了解到如何在 Python 中使用 retrying。

安装retrying库

要安装 retrying 库,我们可以使用 pip 命令:

pip install retrying

retrying的功能

  • 一般装饰器api
  • 特定的停止条件(限制尝试次数)
  • 特定的等待条件(每次尝试之间的指数增长的时间等待)
  • 自定义的异常进行尝试
  • 自定义的异常进行尝试返回结果
  • 最简单的一个使用方法是无论有任何异常出现,都会一直重新调用一个函数、方法,直到返回一个值

基础使用

让我们从一个简单的例子开始。假设我们有一个经常会失败的函数,我们希望在这个函数失败时进行重试。以下是如何使用 retrying 库实现这个目标:

from retrying import retry

@retry
def make_trouble():
    print("Trying...")
    raise Exception("Exception!")

try:
    make_trouble()
except Exception:
    print("Failed, even with retrying.")

在这个例子中,我们使用了 retry 修饰器(decorator)。如果 make_trouble 函数引发异常,retry 会捕获这个异常并重试函数。如果在尝试一定次数后仍然失败,那么异常将会被抛出。
在这里插入图片描述

自定义重试

在默认情况下,retry 会在每次失败后立即重试,直到成功为止。然而,在很多情况下,我们可能希望自定义重试的行为。retrying 库提供了一些参数,让我们能够进行自定义:

  • stop_max_attempt_number:最大重试次数。
  • stop_max_delay:最大延迟毫秒数。
  • wait_fixed:每次重试之间的固定等待时间(毫秒)。
  • wait_random_min,wait_random_max:每次重试之间的随机等待时间(毫秒)。
from retrying import retry

@retry(stop_max_attempt_number=3, wait_fixed=2000)
def make_trouble():
    print("Trying...")
    raise Exception("Exception!")

try:
    make_trouble()
except Exception:
    print("Failed, even with retrying.")

在这个例子中,make_trouble 函数会最多尝试3次,每次尝试之间等待2秒。
在这里插入图片描述

更复杂的重试条件

除了自定义重试次数和等待时间,我们还可以自定义重试的条件。例如,我们可能只希望在特定的异常出现时进行重试。这可以通过在 retry 修饰器中添加一个 retry_on_exception 函数来实现。

from retrying import retry

def retry_if_io_error(exception):
    """Return True if we should retry (in this case when it's an IOError), False otherwise"""
    return isinstance(exception, IOError)

@retry(retry_on_exception=retry_if_io_error,stop_max_attempt_number=3, wait_fixed=2000)
def might_io_error():
    print("Trying...")
    raise IOError("IO Error!")

try:
    might_io_error()
except Exception:
    print("Failed, even with retrying.")

在上面的代码中,我们定义了一个函数 retry_if_io_error,只有当异常是 IOError 类型时,我们才进行重试。
在这里插入图片描述

结束

使用 retrying 库,我们可以很容易地在 Python 中实现错误重试机制。这在处理网络请求、数据库操作或任何可能因暂时性问题失败的操作时都非常有用。希望你已经对如何使用 retrying 有了一个基本的了解,并能在你的 Python 项目中找到它的用武之地。

参考文档

https://juejin.cn/post/7108202816665026573

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

Python错误处理的艺术:使用retrying库实现高效重试机制 的相关文章

  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 手把手教你K最近邻分类器分类CIFAR-10

    KNN算法全称为k Nearest Neighbor Classifier 即k最近邻分类器 它可以看作是Nearest Neighbor Classifier最近邻分类器的加强版 无论是最近邻分类器还是k最近邻分类器 其原理都比较简单 其
  • 前端基础之JavaScript

    知识预览 JavaScript概述 JavaScript的基础 JavaScript的对象 BOM对象 DOM对象 实例练习 js扩展 一 JavaScript概述 JavaScript的历史 1992年Nombas开发出C minus m
  • Git 命令/配置笔记

    创建分支命令 git branch 分支名 切换分支命令 git checkout 分支名 合并分支 到当前分支 git merge 列出本地分支 git branch 删除分支 git branch d 分支名 指定标签信息命令 git
  • ESP8266 ERROR:cut here for exception decoder

    在使用ESP8266获取网站的json信息时 串口输出错误信息 cut here for exception decoder 解决办法 获取json的格式不正确 检查json格式的括号 是否缺少
  • 静态代码扫描中Java资源对象关闭的探究

    本人在探究静态代码扫描中资源对象关闭规则遇到了一些疑惑 本文将这些疑惑记录下来并逐一找出解答 包括在哪些情况下 这些资源对象需要手动关闭 怎么正确的关闭 哪些情况下不需要手动关闭 以及为什么 资源对象包括很多种 本文重点关注输入输出流对象和
  • Process in Shell

    PID current process Get Process Get Process Select Object Name Get Process processname jm Select Object Get Process proc
  • 将本地项目上传到自己公司的gitlab(或是官网gitlab)下(第一次上传)

    转自 https blog csdn net litianxiang kaola article details 74075151 自己公司的gitlab和官网gitlab都是以下的操作步骤 我是自己公司的gitlab已成功 1 安装git
  • python学习笔记(五)---函数

    函数的定义 定义一个函数要使用def语句 依次写出函数名 括号 括号中的参数和冒号 然后 在缩进块中编写函数体 函数的返回值用return语句返回 求绝对值的my abs函数 def my abs x if x gt 0 return x
  • 转载的开源干货

    android相关 第三方库 awesome android ui 大量 Android UI UX 库 大城小黄 recyclerview animators 一个关于RecyclerView items的动画库 一个简单的Recycle
  • 树形排序-TreeMap或者递归

    1TreeMap TreeMap来实现树形结构的排序 TreeMap是一个有序的key value集合 它是通过红黑树实现的 TreeMap默认按照key的升序排序 如果您想要按照每个层级的创建时间排序 您可以将每个节点的创建时间作为key
  • Failed to execute goal on project...

    从eclipse 换到idea 导入了一个maven的父子项目 在idea中的maven project idea双击shift键 执行maven package命令 结果报错 Failed to execute goal on proje
  • 【STM32】时钟系统知识

    基础知识 1 STM32 有5个时钟源 HSI HSE LSI LSE PLL HSI是高速内部时钟 RC振荡器 频率为8MHz 精度不高 HSE是高速外部时钟 可接石英 陶瓷谐振器 或者接外部时钟源 频率范围为4MHz 16MHz LSI
  • plc输入/输出模块的选择

    1 数字量输入模块的选择 1 选择电压等级 根据电压 有DC 5V 12V 24V 48V 60V和交流110V 220V 2 按保护形式分为隔离型和非隔离型两种 3 选择模块密度 按点数分为8分 16分 32分 64分 高密度模块 如32
  • ML--HMM(隐马尔可夫模型及python的实现1)

    1 综述 隐马尔可夫模型是马尔可夫模型的进一步发展 马尔可夫模型是马尔可夫过程的模型化 可以用图1 a 的框图形象表示 它把一个总随机过程看成一系列状态的不断转移 图1 b 是隐马尔可夫模型 1 1几个需要理解的概念 a 马尔可夫性 如果一
  • [QT编程系列-19]: 基础框架 - 信号与槽背后的编程思想

    目录 一 主要的架构思想 二 主要的编程思想 一 主要的架构思想 信号与槽 Signals and Slots 是Qt框架中的一种机制 背后的思想主要有以下几个方面 解耦和松耦合 信号与槽机制通过解耦发出信号的对象和处理信号的对象之间的依赖
  • SQL Server 2012的安装与环境配置以及在Java中连接数据库

    自学Java也已快有一个月了 虽然本人从事的是FPGA开发的工作 但是对于软件开发兴趣盎然 没办法只能工作之余自己慢慢自学了 这应该是我的第一篇Java学习文章 希望以后自己能够坚持 记录一些学习过程 做一些有意思的事 慢慢实现自己的目标吧
  • echarts雷达图自定义射线颜色、边框效果和背景样式

    目录 1 在官网找样例 2 初步改造示例 有个雏形 3 细节改造和优化 4 全部代码 5 原始效果和完成效果对比 1 在官网找样例 样例地址 Examples Apache ECharts 2 初步改造示例 有个雏形 对应的代码 为了说明问
  • 1.7 编程基础之字符串 15 整理药名 python

    http noi openjudge cn ch0107 15 1 7 编程基础之字符串 15 整理药名 http noi openjudge cn ch0107 15 Python字母大小写的转换 两种方法 https blog csdn
  • Java实体类转Map、Map转实体类

    1 创建entity User java package com jeff entity public class User private String userName private String password private I
  • Python错误处理的艺术:使用retrying库实现高效重试机制

    简介 学习如何使用 Python 的 retrying 库来处理在程序运行过程中可能出现的各种异常和错误 retrying 是一种简单 易于使用的重试机制 帮助我们处理由网络问题或其他暂时性错误引起的失败 在很多情况下 简单的重试可能就是解