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

江岸
江岸
发布时间:2026-10-13| 3人浏览过
原创

本文深入解析Python中处理网络波动或程序崩溃的异常重试方案。重点介绍retrying库的使用,涵盖装饰器@retry的基本用法,以及stop_max_attempt_number、wait_fixed、wait_exponential等关键参数的配置。通过示例演示如何根据特定异常或返回值智能控制重试逻辑,结合指数退避算法优化系统性能。

前言

在进行数据抓取任务时,开发者常因网络不稳定导致程序运行中断。早期的处理策略通常仅记录错误信息,并在事后进行人工或脚本干预,缺乏自动恢复机制。

原先的流程:

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类的初始化源码得知:

  • stop_max_attempt_number:用于设定最大尝试次数。一旦超过此限制,系统将停止重试并抛出最终异常。
  • stop_max_delay:例如设置为10000(毫秒),表示从被装饰函数开始执行到成功结束或失败中止的整个时间段。若该时间超过10秒,函数将不再执行。
  • wait_fixed:用于设定两次retrying之间的固定等待时间(毫秒)。
  • wait_random_min和wait_random_max:通过随机方式生成两次retrying之间的等待时间,范围在wait_random_min和wait_random_max之间。
  • wait_exponential_multiplier和wait_exponential_max:以指数形式生成两次retrying之间的等待时间,计算公式为2^previous_attempt_number * wait_exponential_multiplier,其中previous_attempt_number代表此前已经retry的次数。若计算出的值超过wait_exponential_max设定的上限,后续两次重试之间的等待时间将固定为wait_exponential_max。这种设计遵循了exponential backoff算法,有助于减轻服务器阻塞压力。
  • 我们可以指定仅在出现特定异常时才触发重试,这需要传入一个函数对象给retry_on_exception参数:
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函数。如果exception属于IOError类型,则执行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;否则,程序结束并返回该函数值。

总结

以上即为本文的全部内容。希望这些关于Python异常重试方案的解析能对各位的学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。