You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python try except执行后重试如何避免重复代码?有没有更优雅方案?

问题解答

预先判断文件夹的写法是否规范?

不是,该写法存在两个核心问题:

  • 你写的if folder not in os.listdir()逻辑本身错误:os.listdir()返回的是目标路径下的文件名字符串,和Path类型的folder对象比对永远为真,会导致文件夹已存在时仍然重复尝试创建,触发FileExistsError。即使修正为if not folder.exists(),仍然存在竞态条件风险:判断文件夹不存在和执行创建的间隙,其他进程/线程可能已经创建了该文件夹,依然会报错。
  • 这种「先检查再执行」的LBYL(Look Before You Leap)风格不是Python社区处理IO操作的推荐规范,IO操作随时可能因为外部环境变化和预期不一致,更推荐EAFP(Easier to Ask for Forgiveness than Permission)的异常捕获风格。

更优雅的实现方案

场景专属最简方案(针对文件夹不存在的保存场景)

pathlib的mkdir方法自带exist_ok参数,设置为True时,文件夹已存在不会抛出异常,直接保证执行完成后文件夹可用,不需要任何判断或者异常捕获:

from pathlib import Path
import pandas as pd

folder = Path('folder')
# 注意:你示例中的df赋值为列表是错误的,to_feather是pandas DataFrame的方法
df = pd.DataFrame([a,b,c])

# 一行保证文件夹存在,parents=True会自动创建多级父目录
folder.mkdir(parents=True, exist_ok=True)
df.to_feather(folder / 'abc.ftr')

通用重试方案(适用于所有「失败执行修复逻辑再重试」的场景)

如果需要通用的不重复写业务代码的重试逻辑,用两次循环即可实现,不需要单独封装函数:

from pathlib import Path
import pandas as pd

folder = Path('folder')
df = pd.DataFrame([a,b,c])

# 最多尝试2次,第一次失败后执行修复逻辑,第二次重试
for _ in range(2):
    try:
        df.to_feather(folder / 'abc.ftr')
        break
    # 只捕获目标异常,避免掩盖其他错误比如权限不足
    except FileNotFoundError:
        folder.mkdir(parents=True, exist_ok=True)

内容的提问来源于stack exchange,提问作者Hestaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:45:02