惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
T
Tailwind CSS Blog
博客园 - Franky
WordPress大学
WordPress大学
博客园 - 司徒正美
D
DataBreaches.Net
L
LangChain Blog
G
Google Developers Blog
C
Check Point Blog
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
美团技术团队
腾讯CDC
Martin Fowler
Martin Fowler
博客园 - 聂微东
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI

博客园 - emanlee

Django3 核心入门知识点 HTML + CSS + JS 入门核心知识点 vs code 使用python,必须安装python解释器 Ubuntu 修改 ulimit‑n(nofile,最大打开文件数) 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 Word里打出“方框中间带勾”的符号 Windows 10/11 安装 MySQL 5.7 步骤(内部使用) Python编程语言的运行速度(CPU时间),与C语言对比 设置MySQL随操作系统Ubuntu启动 2026年秋季,2027年春季,西安理工大学 校历 博文阅读密码验证 - 博客园 Windows 11,用任务栏的搜索框搜索到一个软件,点击无法打开, 是bug 拆分视频的软件工具,Avidemux 开源免费 无法在此设备上加载驱动程序,可行可用 ubuntu 设置北京日期时间 mysql 在新电脑上导入,出现错误:ERROR at line 4019: Unknown command '\''. - emanlee 安装 yarn npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。 - emanlee VS code, 最近打开过哪些项目或文件夹,把这些备份下来,到另外一台电脑上恢复 傲梅分区助手 【好用】 ubuntu 可以使用Windows远程桌面连接吗?【可以】 把xshell的全部连接和密码,从一台Windows 10电脑,迁移到Windows11电脑。 Windows 远程桌面(mstsc)完整迁移方案(含历史连接记录、RDP 配置、保存的账号密码)【可行】 Endnote,如何能完整迁移库和模版 ubuntu 安装 locate
Python 异常体系核心:BaseException 及其四大子类
emanlee · 2026-04-04 · via 博客园 - emanlee

Python 异常体系核心:BaseException 及其四大子类

这是 Python 异常继承体系的顶层结构,是理解异常捕获、处理逻辑的核心基础


一、总览:Python 异常金字塔顶端 

BaseException(所有异常的祖宗)
├─ Exception(业务/程序异常的基类)
├─ KeyboardInterrupt(用户强制中断)
├─ GeneratorExit(生成器退出)
└─ SystemExit(解释器主动退出)

一句话总结

BaseException 是所有异常的最终父类,它直接派生了 4 个子类,这 4 个类分工完全不同,决定了 Python 异常的捕获规则。


二、逐类详细讲解(最关键)

1. BaseException

  • 定义:Python 异常体系的根类、基类、超类
  • 地位所有异常都继承自它
  • 作用:定义异常的基础结构(message、args、__str__等)
  • 注意不建议直接捕获 BaseException,会把系统退出、用户中断全部拦截,导致程序无法正常退出。

2. Exception(最重要)

  • 地位所有 “业务 / 程序运行异常” 的父类
  • 范围
    • 语法错误之外的所有程序错误
    • 内置异常:ValueErrorTypeErrorIndexErrorKeyErrorAttributeErrorIOErrorZeroDivisionError
    • 自定义异常(必须继承它)
  • 作用:代表程序运行中出现的可处理异常
  • 规范: ✅ 日常开发 只应该捕获 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 解释器退出 ❌ 不能

五、最标准的捕获写法(开发规范)

try:
    业务代码
except Exception as e:
    只处理程序错误
    # 不会拦截 Ctrl+C、sys.exit、生成器关闭

六、一句话终极总结

BaseException 生了四个孩子:

Exception 管程序错误,

KeyboardInterrupt 管用户中断,

SystemExit 管解释器退出,

GeneratorExit 管生成器关闭。

只有 Exception 是程序可处理异常,另外三个都属于系统控制流。