python异常体系以baseexception为根,日常使用exception及其子类;常见异常包括nameerror、typeerror、valueerror、indexerror、keyerror等;应精准捕获、按 specificity 排序、善用else/finally、避免异常作流程控制。

Python 的异常体系以 BaseException 为根类,所有异常都继承自它。实际开发中,绝大多数情况捕获或抛出的是其子类 Exception 及其派生类型,而像 SystemExit、KeyboardInterrupt 这类底层控制类异常通常不建议主动捕获。
核心异常继承关系
理解层级结构是正确处理异常的基础:
- BaseException:所有异常的顶层基类
- ├── Exception:常规异常的父类(业务逻辑、运行时错误等均属此类)
- │ ├── ArithmeticError(如
ZeroDivisionError、OverflowError) - │ ├── LookupError(如
KeyError、IndexError) - │ ├── ValueError(参数值非法,如
int("abc")) - │ ├── TypeError(类型不匹配,如
"a" + 1) - │ ├── IOError / OSError(文件、系统资源相关,3.3+ 后统一为
OSError) - │ └── 自定义异常(应继承
Exception或其子类) - ├── SystemExit(由
sys.exit()触发) - ├── KeyboardInterrupt(用户按 Ctrl+C)
- └── GeneratorExit(生成器退出时内部使用)
高频常见异常及典型场景
以下异常在日常编码中最常出现,掌握其触发条件能快速定位问题:
本文档主要讲述的是eclipse maven工程配置说明;编写本文的目的解决因环境问题带来的一系别问题,比如类没找到异常,JAR新旧并成,导致有些方法不可用,支持热拔插式的修改,当调试程序时,修改后不用重启tomcat等问题;感兴趣的朋友可以过来看看
-
NameError:访问未定义的变量名,例如
print(x)但x从未赋值 -
TypeError:操作或函数应用于不支持的对象类型,如
len(42)、[1,2] + "3" -
ValueError:参数值合法但内容不合理,如
int("12.5")、math.sqrt(-1)(未启用复数) -
IndexError:序列索引越界,如
[0,1][5] -
KeyError:字典中查找不存在的键,如
{"a": 1}["b"];可用.get()或in预判避免 -
AttributeError:访问对象不存在的属性或方法,如
"hello".append("world") -
FileNotFoundError(
OSError子类):打开不存在的文件,如open("missing.txt") -
ImportError / ModuleNotFoundError:模块导入失败,后者是前者的子类(Python 3.6+),如拼错包名或路径未包含在
sys.path
异常处理与设计建议
合理使用 try...except 不仅防崩溃,更体现代码健壮性:
立即学习“Python免费学习笔记(深入)”;
- **只捕获明确预期的异常**:避免空
except:或宽泛捕获Exception,否则可能掩盖真正 bug - **按 specificity 从具体到宽泛排列**:多个
except块时,子类异常写在父类之前,否则会被提前拦截 - **善用
else和finally**:else中放无异常才执行的逻辑(如日志记录),finally保证清理动作(如关闭文件、释放锁)一定执行 - **自定义异常应语义清晰**:继承
Exception,命名以Error结尾(如UserNotFoundError),并在__init__中提供有意义的默认消息 - **不要用异常替代流程控制**:例如判断字典是否存在键,优先用
key in dict或dict.get(key, default),而非依赖KeyError
调试与排查小技巧
快速定位异常源头可大幅节省时间:
- 阅读 traceback:最后一行是异常类型和消息,往上逐行看调用栈,重点关注你写的文件和行号
- 使用
logging.exception()记录完整 traceback,比print(e)更利于后期分析 - 在 IDE 中设置异常断点(如 PyCharm 的 Python Exception Breakpoint),程序会在抛出指定异常时自动暂停
- 对不确定的外部调用(如网络请求、文件读写),始终包裹基础异常处理,并补充上下文信息(如“读取配置文件 config.yaml 失败”)





