Python中try/except已捕获PermissionError仍抛出异常是什么原因?
问题成因
- 调试器特性导致的异常提示误导:你当前是在IDE调试模式下运行代码,大部分IDE默认开启了「所有抛出的异常都触发断点」的规则,哪怕异常已经被你的
except语句捕获,调试器也会在异常抛出的第一时间暂停运行、弹出报错提示。你手动点击继续运行按钮,代码会正常进入except PermissionError分支执行。 - 代码本身存在逻辑漏洞:当
open()调用抛出异常时,变量f根本没有被成功赋值,而finally块无论是否发生异常都会执行f.close(),此时会直接抛出NameError,打断原有异常处理流程。
修复方案
方案1:提前判断条目类型(更稳妥,无额外异常开销)
直接调用文件接口判断条目是否为普通文件,避免尝试打开文件夹:
from pathlib import Path mc_path = Path.home() / "AppData" / "Roaming" / ".minecraft" for entry in mc_path.iterdir(): if entry.is_file(): # 使用with上下文管理器自动处理文件关闭,无需手动调用close with open(entry, "r", encoding="utf-8") as f: # 你的文件处理逻辑写在这里 pass
方案2:修正原有异常捕获逻辑
如果你确实需要保留try/except的处理方式,调整逻辑避免未定义变量访问:
import os from pathlib import Path path = str(Path.home() / "AppData" / "Roaming" / ".minecraft") mc_dir = os.listdir(path) for entry in mc_dir: f = None try: f = open(os.path.join(path, entry), "r") # 你的文件处理逻辑写在这里 except PermissionError: # 无权限直接跳过当前条目 continue finally: # 仅当文件对象成功创建时才执行关闭 if f is not None: f.close()
注:尽量使用
os.path.join或者pathlib的/运算符拼接路径,不要手动拼接反斜杠,可避免路径格式错误问题。
内容的提问来源于stack exchange,提问作者ikyyntts
相关产品推荐
相关产品推荐

