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
相关产品推荐
相关产品推荐

