应捕获 filenotfounderror 而非预检 exists,因存在竞态风险;需区分处理 filenotfounderror(路径不存在)与 permissionerror(无权限);推荐用 pathlib.path.open() 并避免 is_file() 预检。

捕获 FileNotFoundError 而不是用 os.path.exists() 预检
直接尝试打开再捕获异常,比先用 os.path.exists() 判断再打开更可靠。因为两次系统调用之间文件状态可能变化(比如被其他进程删除),导致“检查时存在、打开时却没了”的竞态问题。
实操建议:
- 始终用
try/except包裹open(),捕获FileNotFoundError - 避免写
except Exception:—— 会吞掉真正该暴露的错误,比如PermissionError或编码错误 - 如果只是想“有就读,没有就跳过”,在
except FileNotFoundError:里设默认值或继续循环即可
try:
with open("config.json") as f:
data = json.load(f)
except FileNotFoundError:
data = {"default": True} # 安全降级
区分 FileNotFoundError 和 PermissionError
这两个异常常被混淆:前者是路径根本不存在(或父目录缺失),后者是路径存在但无读权限。处理逻辑通常不同——前者可补默认值,后者往往要报错或提示用户检查权限。
实操建议:
- 显式分开
except FileNotFoundError:和except PermissionError: - Linux/macOS 下注意符号链接断裂也会触发
FileNotFoundError,而非OSError - Windows 上路径含非法字符(如
、<code>|)也可能抛FileNotFoundError,实际是系统层返回了ERROR_PATH_NOT_FOUND
用 pathlib.Path.open() 替代内置 open() 提升可读性
pathlib 的 Path 对象让路径操作更自然,且 .open() 方法语义清晰,配合 is_file() 等方法也比字符串拼接 + os 模块更少出错。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
实操建议:
- 用
Path("data.txt").open("r")替代open("data.txt"),类型安全且 IDE 更易推导 - 不要依赖
Path.is_file()做预检——它同样存在竞态,仍需try/except - 路径拼接统一用
/运算符:Path("logs") / "app.log",不拼字符串
from pathlib import Path
<p>p = Path("user_settings.toml")
try:
content = p.read_text(encoding="utf-8")
except FileNotFoundError:
content = "[defaults]\ntheme = 'light'"
</p>
需要重试或 fallback 时,别把异常处理写成嵌套黑洞
当涉及多个备选路径(如配置文件查找顺序)或网络挂载点延迟就绪时,容易写出层层 try/except 嵌套,难以维护。
实操建议:
- 把候选路径列成元组或列表,用
for循环依次尝试 - 每次
open()都单独try/except,成功就读取并break - 循环结束后仍未成功,再统一处理“全部失败”场景(比如 raise 自定义异常或返回
None)
复杂点在于路径是否需要提前验证可读性(比如 .is_readable()),但这个方法本身不保证线程安全——真正可靠的只有打开那一刻的异常捕获。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










