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

为何Python代码中finally块执行但try内日志与异常日志均未输出?

Python异常捕获未触发的场景分析

代码示例

logger.info("Checkpoint 1")
try:
    queue.push(item) # 此处可能抛出异常
    logger.info("Checkpoint 2")
except queues.errors.NotAllowedError as exc:
    logger.info("Error 1")
    raise exc
except Exception as e:
    logger.info("Error 2")
finally:
    logger.info("Checkpoint 3")

预期输出

  • 正常执行时:
Checkpoint 1
Checkpoint 2
Checkpoint 3
  • 发生Exception子类异常时示例:
Checkpoint 1
Error 2
Checkpoint 3

实际输出

Checkpoint 1
Checkpoint 3

问题解答

Exception无法捕获所有异常

是的,Exception仅能捕获自身及其子类的异常,Python中存在部分继承自BaseException的异常,不会被except Exception分支捕获,这是导致上述输出的核心原因之一。

可能的触发场景

  • 系统级退出/中断异常:比如SystemExit(调用sys.exit()触发)、KeyboardInterrupt(按下Ctrl+C中断程序),这类异常直接继承自BaseException,不会进入except Exception处理分支,会直接执行finally块后终止程序,因此不会输出Error1或Error2。
  • 异步任务取消异常:在异步代码场景中,如果queue.push(item)触发了asyncio.CancelledError(同样继承自BaseException),也会绕过except Exception分支,直接执行finally块。
  • C扩展模块抛出致命错误:如果queue.push调用了底层C编写的扩展模块,模块触发了无法被Python异常机制捕获的致命错误(如段错误、内存访问违规),解释器可能直接终止,仅来得及执行finally块的日志,无异常分支日志输出。
  • 日志系统故障:概率较低,但如果异常发生后,日志记录器被禁用、输出流中断或配置错误,会导致Error1/Error2的日志无法正常输出,最终只显示Checkpoint1和Checkpoint3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:45:09