Python 异常体系核心:BaseException 及其四大子类
Python 异常体系核心:BaseException 及其四大子类
这是 Python 异常继承体系的顶层结构,是理解异常捕获、处理逻辑的核心基础。
一、总览:Python 异常金字塔顶端
BaseException(所有异常的祖宗)
├─ Exception(业务/程序异常的基类)
├─ KeyboardInterrupt(用户强制中断)
├─ GeneratorExit(生成器退出)
└─ SystemExit(解释器主动退出)
一句话总结:
BaseException 是所有异常的最终父类,它直接派生了 4 个子类,这 4 个类分工完全不同,决定了 Python 异常的捕获规则。
二、逐类详细讲解(最关键)
1. BaseException
- 定义:Python 异常体系的根类、基类、超类
- 地位:所有异常都继承自它
- 作用:定义异常的基础结构(message、args、__str__等)
- 注意:不建议直接捕获 BaseException,会把系统退出、用户中断全部拦截,导致程序无法正常退出。
2. Exception(最重要)
- 地位:所有 “业务 / 程序运行异常” 的父类
- 范围:
- 语法错误之外的所有程序错误
- 内置异常:
ValueError、TypeError、IndexError、KeyError、AttributeError、IOError、ZeroDivisionError等 - 自定义异常(必须继承它)
- 作用:代表程序运行中出现的可处理异常
- 规范:
✅ 日常开发 只应该捕获 Exception 或其子类❌ 不要捕获 BaseException
3. KeyboardInterrupt
- 触发条件:用户在控制台按
Ctrl + C强制终止程序 - 继承:直接继承 BaseException,不属于 Exception
- 特点:
- 专门用于终止程序
- 如果你写
except Exception:捕获不到它
- 用途:让用户可以随时中断死循环 / 长时间任务
4. GeneratorExit
- 触发条件:生成器(generator)被关闭时
- 调用
gen.close() - 生成器被垃圾回收
- 调用
- 继承:直接继承 BaseException
- 特点:不属于 Exception,普通捕获抓不到
- 用途:用于生成器内部资源清理
5. SystemExit
- 触发条件:Python 解释器主动退出
sys.exit()exit()quit()
- 继承:直接继承 BaseException
- 特点:不是错误,是正常退出信号
- 作用:控制程序优雅退出,不会被
except Exception拦截
三、最关键的规则(面试 / 开发必考)
✔ 规则 1
Exception 只能捕获程序异常,不能捕获系统退出类异常
下面这些都不会被
except Exception: 捕获:KeyboardInterrupt(Ctrl+C)SystemExit(sys.exit)GeneratorExit(生成器关闭)
它们都直接继承 BaseException。
✔ 规则 2
只有
except BaseException: 才能捕获所有异常,但严禁乱用。✔ 规则 3
自定义异常必须继承 Exception,不能继承 BaseException
四、一张表彻底记住
表格
| 异常类名 | 父类 | 含义 | 能否被 except Exception 捕获 |
|---|---|---|---|
| BaseException | 无(根) | 所有异常的祖宗 | — |
| Exception | BaseException | 程序异常基类 | ✅ 能 |
| KeyboardInterrupt | BaseException | Ctrl+C 中断 | ❌ 不能 |
| GeneratorExit | BaseException | 生成器关闭 | ❌ 不能 |
| SystemExit | BaseException | 解释器退出 | ❌ 不能 |
五、最标准的捕获写法(开发规范)
python
运行
try:
业务代码
except Exception as e:
只处理程序错误
# 不会拦截 Ctrl+C、sys.exit、生成器关闭
六、一句话终极总结
BaseException 生了四个孩子:
Exception 管程序错误,
KeyboardInterrupt 管用户中断,
SystemExit 管解释器退出,
GeneratorExit 管生成器关闭。
只有 Exception 是程序可处理异常,另外三个都属于系统控制流。

浙公网安备 33010602011771号