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

