You need to enable JavaScript to run this app. Python中try/except已捕获PermissionError仍抛出异常是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

Python中try/except已捕获PermissionError仍抛出异常是什么原因?

问题成因

  1. 调试器特性导致的异常提示误导:你当前是在IDE调试模式下运行代码,大部分IDE默认开启了「所有抛出的异常都触发断点」的规则,哪怕异常已经被你的except语句捕获,调试器也会在异常抛出的第一时间暂停运行、弹出报错提示。你手动点击继续运行按钮,代码会正常进入except PermissionError分支执行。
  2. 代码本身存在逻辑漏洞:当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 11:54:07