发布于2026-07-23 阅读(0)
扫一扫,手机访问
Python 的错误处理,大多数人第一反应就是 try-except。但如果你只是想让某个函数在报错后自动重试几次,每次都写一堆 try-except 未免太啰嗦。retry 这个模块就是专门干这事儿的——一个装饰器搞定,简洁到没朋友。下面就来聊聊它的基本玩法。

retry 最常见的用法就是作为装饰器直接套在函数上。不传任何参数时,效果是:只要函数抛出异常,就不停地重试,直到成功为止。看个例子:
from retry import retry
@retry()
def make_trouble():
'''Retry until succeed'''
print ('retrying...')
raise
if __name__ == '__main__':
make_trouble()
# 输出: 一直重试,直到运行成功
retrying...
retrying...
retrying...
retrying...
retrying...
retrying...
这段代码里,make_trouble() 每次运行都会抛出异常,而 @retry() 会捕获异常并重新调用函数,于是屏幕上就会不断打印“retrying...”,直到你手动终止或者函数终于不报错为止。这就是 retry 最核心的机制:重试,直到成功。
当然,实际场景中很少会允许无限重试。retry 提供了几个关键参数来控制重试的行为,先看它的函数签名:
def retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, logger=logging_logger):
"""Return a retry decorator.
:param exceptions: an exception or a tuple of exceptions to catch. default: Exception.
:param tries: the maximum number of attempts. default: -1 (infinite).
:param delay: initial delay between attempts. default: 0.
:param max_delay: the maximum value of delay. default: None (no limit).
:param backoff: multiplier applied to delay between attempts. default: 1 (no backoff).
:param jitter: extra seconds added to delay between attempts. default: 0.
fixed if a number, random if a range tuple (min, max)
:param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
default: retry.logging_logger. if None, logging is disabled.
"""
下面逐一说明几个关键参数的作用:
(ValueError, TimeoutError),只对指定类型的异常触发重试。delay 使用,具体公式是 delay * backoff ** (尝试次数 - 1)。比如 delay=3, backoff=2,第一次重试前等 3×2⁰=3 秒,第二次等 3×2¹=6 秒,第三次等 12 秒……以此类推。默认 backoff=1 表示不增长。delay * backoffⁿ 超过这个值后,就不再继续增长,固定为 max_delay。附录:git源码
retry 模块最大的优点就是轻量、直接,几行代码就能给函数加上重试机制。相比手动写 try-except 循环,它让代码更干净,可读性更高。实际项目中,配合 tries 和 delay 参数,就能优雅地处理网络请求、文件读写等易出错的场景。当然,如果遇到更复杂的重试逻辑(比如指数退避、随机抖动),可以考虑更强大的 tenacity 库,但大部分场景下 retry 已经足够用了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8