0

0

Python 内置异常层级结构全解析

冰川箭仙

冰川箭仙

发布时间:2026-02-05 18:53:20

|

412人浏览过

|

来源于php中文网

原创

最可靠方式是调用BaseException.__subclasses__()递归遍历继承树,因其反映CPython运行时真实结构,比文档或help更全;except Exception捕不到SystemExit等退出异常,应避免except BaseException。

python 内置异常层级结构全解析

Python 异常类继承关系怎么查最可靠

直接看 BaseException__subclasses__() 链,比翻文档或记忆更准——因为 CPython 源码里新增异常(比如 KeyboardInterrupt)未必全在文档“标准异常”表里列全,而 __subclasses__() 是运行时真实继承树。

实操建议:

  • 在 Python 交互式环境里执行 BaseException.__subclasses__(),得到顶层子类(如 SystemExitKeyboardInterruptException
  • 对每个子类再调用 __subclasses__(),递归展开(注意避开循环引用,ExceptionBaseException 本身不互为直接父子)
  • 别依赖 help(Exception) 输出的“Subclasses”列表——它只显示模块级定义的类,漏掉动态生成的(如某些库注入的异常)

捕获 ExceptionBaseException 的实际区别

except Exception: 捕不到 SystemExitKeyboardInterruptGeneratorExit;但 except BaseException: 会捕到——这在写守护进程或 CLI 工具时极易出问题:比如你本想优雅退出,却因捕了 BaseExceptionCtrl+C 给吞了,导致程序无法中断。

常见错误现象:

立即学习Python免费学习笔记(深入)”;

  • 脚本加了 except BaseException: 后,Ctrl+C 失效,必须 kill -9
  • 单元测试里用 self.assertRaises(BaseException) 断言失败,因为测试框架本身抛的是 AssertionError(继承自 Exception),不是 BaseException 直系子类

正确做法:除非你在写解释器或信号拦截层,否则一律用 except Exception:;真要处理退出信号,显式捕 KeyboardInterruptSystemExit

Python v2.4 中文手册 chm
Python v2.4 中文手册 chm

Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。

下载

raise 时不带参数和带 None 的行为差异

except 块里写 raise(无参数)会原样重抛当前异常,保留原始 traceback;写 raise None 是语法错误,Python 3.10+ 会报 SyntaxError: invalid syntax;而 raise e(其中 e 是捕获的异常实例)会创建新 traceback,丢失原始上下文。

使用场景与风险:

  • 日志后透传异常:用 raise(空 raise),不要 raise e
  • 想改写异常类型但保留 traceback:用 raise NewError(...) from e,触发异常链
  • raise e 在多线程/协程中尤其危险——原始异常可能来自其他上下文,traceback 完全失真

自定义异常该继承 Exception 还是 RuntimeError

绝大多数情况继承 Exception 就够了。继承 RuntimeError 只在明确表示“程序运行时发生了未预期状态,且不属于 I/O、类型、逻辑等已有分类”时才合理——比如异步任务调度器检测到死锁,或 ORM 发现对象状态不一致。

性能与兼容性影响:

  • 所有内置异常检查(如 isinstance(e, Exception))对 Exception 子类天然兼容;若继承 RuntimeError,需额外确认下游是否只检查 Exception
  • 某些框架(如 Flask 的错误处理器)默认只捕 Exception 及其子类,不处理 RuntimeError 的子类,除非显式注册
  • 别为了“显得更具体”而深挖继承链——MyAppError 继承 Exception 比继承 ValueError 更安全,除非你真要参与 int() 那类函数的错误语义

真正容易被忽略的是:异常类名末尾要不要加 ErrorException。PEP 8 明确建议用 Error(如 ParseError),但很多主流库(requests、sqlalchemy)混用。统一就行,别在同一个项目里既有 ConnectionError 又有 TimeoutException

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

91

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

73

2025.12.15

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

91

2025.08.25

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

73

2025.12.15

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

317

2023.10.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

585

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

550

2024.08.29

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号