一、什么是异常?
-
异常 是程序执行过程中出现的错误事件,会导致程序中断(如除零错误、文件不存在等)。
-
异常处理 用于捕获并处理这些错误,使程序更健壮。
二、基本语法:try
- except
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError:
# 处理特定异常
print("不能除以零!")
关键点:
- 捕获多个异常:
try:
# 代码
except (ZeroDivisionError, TypeError) as e:
print(f"错误类型:{type(e).__name__}, 信息:{e}")
- 捕获所有异常(慎用):
try:
# 代码
except Exception as e: # 避免裸露的 except:
print(f"发生错误:{e}")
三、else
和 finally
-
else
:当try
块无异常时执行。 -
finally
:无论是否异常,最后都会执行(常用于释放资源,如关闭文件)。
try:
file = open("test.txt", "r")
except FileNotFoundError:
print("文件不存在")
else:
print("文件已打开")
content = file.read()
file.close()
finally:
print("程序执行完毕")
四、主动抛出异常:raise
def validate_age(age):
if age < 0:
raise ValueError("年龄不能为负数")
return age
try:
validate_age(-5)
except ValueError as e:
print(e) # 输出:年龄不能为负数
五、自定义异常
class MyCustomError(Exception):
def __init__(self, message):
super().__init__(message)
try:
raise MyCustomError("这是自定义错误")
except MyCustomError as e:
print(e) # 输出:这是自定义错误
六、常见内置异常类型
Python 异常类型均继承自 BaseException
,以下是常用的子类:
1. 基础错误
异常类型 | 触发场景示例 |
---|---|
Exception | 所有内置异常的基类(一般异常基类) |
BaseException | 所有异常的顶级基类(一般不直接捕获) |
SyntaxError | 语法错误(如 print("Hello) 缺少引号) |
IndentationError | 缩进错误(代码块对齐错误) |
2. 运算相关
异常类型 | 触发场景示例 |
---|---|
ZeroDivisionError | 除数为零(如 10 / 0 ) |
ArithmeticError | 所有算术错误的基类(如溢出) |
OverflowError | 数值运算结果超出范围(如超大整数) |
3. 数据类型相关
异常类型 | 触发场景示例 |
---|---|
TypeError | 类型不匹配(如 "a" + 1 ) |
ValueError | 值无效(如 int("abc") ) |
AssertionError | assert 断言失败 |
4. 容器操作相关
异常类型 | 触发场景示例 |
---|---|
IndexError | 索引越界(如 lst[10] ,列表长度不足) |
KeyError | 字典键不存在(如 dct["key"] ) |
AttributeError | 对象属性不存在(如 obj.undefined_method() ) |
5. 文件/IO相关
异常类型 | 触发场景示例 |
---|---|
FileNotFoundError | 文件不存在(如 open("nonexist.txt") ) |
PermissionError | 无操作权限(如写入只读文件) |
IOError | 输入输出错误(Python 3 中合并到 OSError ) |
6. 系统/环境相关
异常类型 | 触发场景示例 |
---|---|
OSError | 操作系统级错误(如文件路径错误) |
KeyboardInterrupt | 用户按下中断键(如 Ctrl+C) |
MemoryError | 内存耗尽 |
7. 其他常用异常
异常类型 | 触发场景示例 |
---|---|
StopIteration | 迭代器没有更多值(手动触发或生成器结束) |
ImportError | 导入模块失败(如模块不存在) |
NameError | 变量未定义(如 print(undefined_var) ) |
UnicodeError | Unicode 编解码错误 |
七、其他异常和警告
1. 警告(继承自 Warning
)
类型 | 说明 |
---|---|
DeprecationWarning | 已弃用功能的警告 |
UserWarning | 用户自定义警告 |
2. 自定义异常
可通过继承 Exception
类创建:
class MyError(Exception):
pass
八、异常继承关系(简图)
BaseException
├── KeyboardInterrupt
├── SystemExit
└── Exception
├── ArithmeticError
│ ├── ZeroDivisionError
│ └── ...
├── AssertionError
├── AttributeError
├── EOFError
├── ImportError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── NameError
├── OSError
│ ├── FileNotFoundError
│ ├── PermissionError
│ └── ...
├── RuntimeError
├── SyntaxError
├── TypeError
├── ValueError
└── ...