Python中的异常和断言
文章目录
- Python中的异常和断言
-
- 一、异常
-
- 1.什么是异常?
- 2. Python 异常的层次结构
- 3. 异常处理:try...except...else...finally
-
- 1. 基本语法
- 2. 实例演示
- 4. 常见内置异常详解
- 5. 主动抛出异常:raise
- 6.自定义异常
- 7. finally:资源清理的保障
- 8. else 子句的作用
- 9. 注意事项
- 10. 异常链(Exception Chaining)—— Python 3 特性
- 11. 异常对象常用属性
- 二、断言(assert)
-
- 1. 用法示例
-
- 1. 最简单的断言
- 2. 不带消息的断言
- 3. 用于函数参数校验
- 2. 断言的本质和底层机制
- 3. 禁用断言:-O 优化模式
- 断言和异常的区别
-
- 推荐使用 `assert` 的场景
- 推荐使用 `raise` 异常的场景
Python中的异常和断言
一、异常
1.什么是异常?
在程序运行过程中,如果发生错误或意外情况(如除零、文件不存在、类型不匹配等),Python 会中断当前的正常执行流程,并创建一个“异常对象”,然后尝试寻找能够“处理”这个异常的代码。这个过程叫做“抛出异常(raise an exception)”。
如果没有找到处理代码,程序会终止并打印错误信息(Traceback)。
异常 ≠ 语法错误
语法错误(如拼写错误、缺少冒号)是在编译/解析阶段就被发现的,程序根本不会运行。
异常是在程序运行时(Runtime) 发生的错误。
2. Python 异常的层次结构
Python 中所有异常都继承自内置的 BaseException
类。但通常我们处理的是继承自 Exception
的异常(因为 BaseException
还包括 SystemExit
, KeyboardInterrupt
等系统级异常)。
你可以通过 help('builtins')
或查阅官方文档查看完整列表。
3. 异常处理:try…except…else…finally
Python 使用 try
语句块来“捕获”并“处理”异常。
1. 基本语法
try:# 可能出错的代码risky_code()
except ExceptionType as e:# 处理特定类型的异常handle_error(e)
except AnotherException:# 处理另一种异常handle_another_error()
except: # 不推荐!捕获所有异常(包括 KeyboardInterrupt 等)handle_anything()
else:# 如果 try 块没有发生任何异常,执行这里print("一切正常!")
finally:# 无论是否发生异常,都会执行(用于清理资源)cleanup()
尽量捕获具体的异常类型,避免裸
except:
2. 实例演示
def divide(a, b):try:result = a / bprint(f"{a} / {b} = {result}")except ZeroDivisionError as e:print(f"错误:不能除以零!({e})")except TypeError as e:print(f"错误:参数类型不正确!({e})")else:print(" 计算成功!")finally:print(" 除法操作结束。")# 测试
divide(10, 2) # 正常
divide(10, 0) # ZeroDivisionError
divide(10, "a") # TypeError
输出:
10 / 2 = 5.0
计算成功!
除法操作结束。
错误:不能除以零!(division by zero)
除法操作结束。
错误:参数类型不正确!(unsupported operand type(s) for /: ‘int’ and ‘str’)
除法操作结束。
4. 常见内置异常详解
异常类 | 触发场景 | 示例 |
---|---|---|
ZeroDivisionError | 除数为零 | 10 / 0 |
IndexError | 序列索引越界 | lst = [1,2]; lst[5] |
KeyError | 字典中键不存在 | d = {'a':1}; d['b'] |
ValueError | 传入了正确类型但不合适的值 | int("hello") |
TypeError | 操作或函数应用于不适当类型的对象 | "a" + 1 |
NameError | 变量未定义 | print(x) (x未定义) |
AttributeError | 对象没有该属性或方法 | "abc".append() |
FileNotFoundError | 文件或目录不存在 | open("nofile.txt") |
ImportError | 导入模块失败 | import non_existent_module |
OSError | 操作系统相关错误(如权限不足) | 文件操作失败 |
5. 主动抛出异常:raise
你可以使用 raise
语句主动抛出异常,通常用于:
- 参数校验失败
- 业务逻辑错误
- 强制调用者处理某种情况
def set_age(age):if not isinstance(age, int):raise TypeError("年龄必须是整数")if age < 0 or age > 150:rais