Python中的异常类型
Python 异常类型大全
Python 提供了丰富的内置异常类型,用于处理各种运行时错误。以下是按照层次结构组织的常用异常类型:
异常层次结构概览
BaseException
├── KeyboardInterrupt
├── SystemExit
├── GeneratorExit
└── Exception
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ ├── BlockingIOError
│ ├── ChildProcessError
│ ├── ConnectionError
│ │ ├── BrokenPipeError
│ │ ├── ConnectionAbortedError
│ │ ├── ConnectionRefusedError
│ │ └── ConnectionResetError
│ ├── FileExistsError
│ ├── FileNotFoundError
│ ├── InterruptedError
│ ├── IsADirectoryError
│ ├── NotADirectoryError
│ ├── PermissionError
│ ├── ProcessLookupError
│ └── TimeoutError
├── ReferenceError
├── RuntimeError
│ ├── NotImplementedError
│ └── RecursionError
├── StopAsyncIteration
├── StopIteration
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ ├── UnicodeError
│ │ ├── UnicodeDecodeError
│ │ ├── UnicodeEncodeError
│ │ └── UnicodeTranslateError
│ └── UnsupportedOperation
└── Warning
├── DeprecationWarning
├── FutureWarning
├── UserWarning
└── ...
常用异常类型详解
1. 基础异常类
# BaseException - 所有异常的基类
# Exception - 几乎所有内置异常的基类(推荐捕获这个)
2. 算术运算异常 (ArithmeticError)
# ZeroDivisionError - 除零错误
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"除零错误: {e}")
# OverflowError - 数值运算超出最大限制
try:
import math
huge_number = math.exp(1000) # 可能引发OverflowError
except OverflowError as e:
print(f"数值溢出: {e}")
# FloatingPointError - 浮点计算错误
3. 断言错误
# AssertionError - 断言语句失败
try:
x = 5
assert x > 10, "x应该大于10"
except AssertionError as e:
print(f"断言失败: {e}")
4. 属性相关异常
# AttributeError - 属性引用或赋值失败
try:
class MyClass:
pass
obj = MyClass()
print(obj.nonexistent_attribute)
except AttributeError as e:
print(f"属性错误: {e}")
5. 输入输出异常
# EOFError - 到达文件末尾仍尝试读取
try:
input() # 在无输入的情况下按Ctrl+D (Unix) 或 Ctrl+Z (Windows)
except EOFError as e:
print(f"文件结束错误: {e}")
# IOError - 在Python 3.3+中与OSError合并
6. 导入相关异常
# ImportError - 导入模块/对象失败
try:
import non_existent_module
except ImportError as e:
print(f"导入错误: {e}")
# ModuleNotFoundError - 模块未找到(ImportError的子类)
try:
import some_unknown_package
except ModuleNotFoundError as e:
print(f"模块未找到: {e}")
7. 索引和键查找异常 (LookupError)
# IndexError - 序列索引超出范围
try:
my_list = [1, 2, 3]
print(my_list[10])
except IndexError as e:
print(f"索引错误: {e}")
# KeyError - 字典中查找不存在的键
try:
my_dict = {"a": 1, "b": 2}
print(my_dict["c"])
except KeyError as e:
print(f"键错误: {e}")
8. 内存相关异常
# MemoryError - 内存不足
try:
huge_list = [0] * (10**10) # 尝试分配超大列表
except MemoryError as e:
print(f"内存不足: {e}")
9. 名称相关异常
# NameError - 局部或全局名称未找到
try:
print(undefined_variable)
except NameError as e:
print(f"名称错误: {e}")
# UnboundLocalError - 访问未绑定的局部变量
def test_function():
try:
print(x) # 在赋值前引用
x = 5
except UnboundLocalError as e:
print(f"未绑定局部变量: {e}")
10. 操作系统相关异常 (OSError及其子类)
# FileNotFoundError - 文件或目录不存在
try:
with open("nonexistent_file.txt", "r") as f:
content = f.read()
except FileNotFoundError as e:
print(f"文件未找到: {e}")
# PermissionError - 没有操作权限
try:
with open("/root/protected_file", "w") as f:
f.write("test")
except PermissionError as e:
print(f"权限错误: {e}")
# FileExistsError - 创建已存在的文件/目录
import os
try:
os.makedirs("existing_directory")
except FileExistsError as e:
print(f"文件已存在: {e}")
# IsADirectoryError / NotADirectoryError - 目录/文件类型错误
try:
with open("/", "r") as f: # 尝试以文件方式打开目录
content = f.read()
except IsADirectoryError as e:
print(f"这是一个目录: {e}")
# TimeoutError - 操作超时
import socket
try:
socket.create_connection(("google.com", 80), timeout=0.001)
except TimeoutError as e:
print(f"连接超时: {e}")
# ConnectionError 及其子类
try:
# 各种连接错误的示例
pass
except ConnectionError as e:
print(f"连接错误: {e}")
11. 引用相关异常
# ReferenceError - 弱引用访问已回收对象
import weakref
try:
class MyClass:
pass
obj = MyClass()
weak_obj = weakref.ref(obj)
del obj
weak_obj() # 访问已回收对象
except ReferenceError as e:
print(f"引用错误: {e}")
12. 运行时异常 (RuntimeError)
# NotImplementedError - 抽象方法未实现
class BaseClass:
def must_implement(self):
raise NotImplementedError("子类必须实现此方法")
try:
obj = BaseClass()
obj.must_implement()
except NotImplementedError as e:
print(f"未实现错误: {e}")
# RecursionError - 递归深度超过限制
def recursive_function(n):
return recursive_function(n + 1)
try:
recursive_function(0)
except RecursionError as e:
print(f"递归深度超限: {e}")
13. 迭代相关异常
# StopIteration - 迭代器没有更多值
try:
iterator = iter([1, 2])
next(iterator)
next(iterator)
next(iterator) # 没有更多元素
except StopIteration as e:
print(f"迭代结束: {e}")
# StopAsyncIteration - 异步迭代器没有更多值
14. 语法相关异常
# SyntaxError - 语法错误
try:
eval("x =") # 无效语法
except SyntaxError as e:
print(f"语法错误: {e}")
# IndentationError - 缩进错误
try:
exec("if True:\nprint('hello')") # 缩进不正确
except IndentationError as e:
print(f"缩进错误: {e}")
# TabError - Tab和空格混用
15. 系统相关异常
# SystemError - 解释器内部错误
16. 类型相关异常
# TypeError - 操作或函数应用于不适当类型的对象
try:
"2" + 2 # 字符串和整数不能相加
except TypeError as e:
print(f"类型错误: {e}")
17. 值相关异常 (ValueError)
# ValueError - 操作接收到正确类型但不合适的值
try:
int("abc") # 字符串无法转换为整数
except ValueError as e:
print(f"值错误: {e}")
# UnicodeError 及其子类
try:
"test".encode('ascii').decode('utf-8') # 编码解码不匹配
except UnicodeDecodeError as e:
print(f"Unicode解码错误: {e}")
18. 警告类 (Warning)
# 警告不是异常,但可以转换为异常
import warnings
warnings.simplefilter("error") # 将警告转换为异常
try:
warnings.warn("这是一个警告", DeprecationWarning)
except DeprecationWarning as e:
print(f"捕获到警告: {e}")
完整异常处理示例
def comprehensive_exception_demo():
"""展示多种异常的处理方式"""
exceptions_to_demo = [
# (引发异常的代码, 异常类型, 描述)
(lambda: 1/0, ZeroDivisionError, "除零错误"),
(lambda: [1,2,3][10], IndexError, "索引越界"),
(lambda: {}['key'], KeyError, "字典键不存在"),
(lambda: int('abc'), ValueError, "值转换错误"),
(lambda: '2' + 2, TypeError, "类型不匹配"),
(lambda: open('nonexistent.txt'), FileNotFoundError, "文件不存在"),
(lambda: undefined_var, NameError, "变量未定义"),
]
for code, expected_exception, description in exceptions_to_demo:
try:
code()
except expected_exception as e:
print(f"{description}: {e}")
except Exception as e:
print(f"意外异常 {type(e).__name__}: {e}")
# 运行示例
comprehensive_exception_demo()
最佳实践建议
- 具体化异常捕获:尽量捕获具体的异常类型
- 避免裸except:不要使用空的except语句
- 合理使用异常链:了解异常的层次结构
- 记录异常信息:使用logging记录异常详情
- 资源清理:使用try-finally或with语句确保资源释放
这个列表涵盖了Python中绝大多数常用的异常类型,掌握它们有助于编写更健壮、可维护的代码。
浙公网安备 33010602011771号