except: 比 except exception: 更危险,因其无差别捕获包括 keyboardinterrupt、systemexit、generatorexit 在内的所有 baseexception 子类,导致 ctrl+c 失效、sys.exit() 卡死、生成器无法正常退出,破坏 python 运行契约。

因为 except: 会捕获 KeyboardInterrupt、SystemExit、GeneratorExit 这三类系统级异常,导致用户无法用 Ctrl+C 中断程序、sys.exit() 失效、异步生成器无法正常退出——这不是“兜底”,而是破坏 Python 的运行契约。
为什么 except: 比 except Exception: 更危险
两者都宽泛,但危险点不同:except: 是无差别全收,连 Python 解释器用来控制流程的信号都一并吞掉;except Exception: 至少放过了那三个关键的 BaseException 子类。
-
KeyboardInterrupt被吞 → 用户按 Ctrl+C 没反应,只能kill -9 -
SystemExit被吞 →sys.exit(0)不生效,命令行脚本无法正常退出,CI/CD 流程卡死 -
GeneratorExit被吞 →async with或生成器close()失败,资源泄漏风险上升
哪些场景下 except: 看似合理,实则埋雷
常见于守护进程、CLI 工具主函数、或初学者写的“防崩溃”包装逻辑,误以为“不崩就是稳”。但真实后果是:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 本地调试时 Ctrl+C 失效,反复
ps aux | grep python杀进程 - Docker 容器收到
SIGTERM后无法优雅退出,Kubernetes 触发强制 kill - 单元测试里用
except:捕获异常后继续跑,结果断言通过但实际逻辑已错位
如果真要兜底,该怎么做
顶层入口(如 if __name__ == "__main__":)确实需要兜底,但必须满足两个硬条件:记录完整 traceback + 不干扰系统信号。
- 用
except Exception as e:,不是except: - 必须调用
logging.exception(...)或等价方式输出完整堆栈,不能只打印模糊字符串 - 绝不能在块内写
pass、空print或静默返回,否则等于主动丢日志 - 若需兼容第三方库抛出的未文档化异常,优先查源码或用
except (ConnectionError, TimeoutError, requests.exceptions.RequestException):显式列举
真正难的不是写哪条 except,而是判断这个异常该在哪个层级被拦截——捕获位置错一层,日志、监控、重试逻辑就全偏了。系统级信号不该被业务代码碰,这是 Python 异常体系设计的底线。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










