Python 中 raise 关键字用于主动引发异常
在 Python 中,raise
关键字用于主动引发异常。你可以直接引发内置异常,或通过继承 Exception
类创建自定义异常。以下是详细说明和示例:
1. 基本用法
引发内置异常(如 ValueError
):
def divide(a, b):
if b == 0:
raise ValueError("除数不能为零") # 引发异常并附带错误信息
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(f"捕获到异常: {e}") # 输出: 捕获到异常: 除数不能为零
2. 重新引发当前异常
在 except
块中,使用 raise
不带参数可重新引发当前异常:
try:
x = int("invalid")
except ValueError:
print("转换失败")
raise # 重新引发 ValueError
3. 引发自定义异常
通过继承 Exception
创建自定义异常:
class MyCustomError(Exception):
pass
def check_positive(value):
if value < 0:
raise MyCustomError("值不能为负数")
try:
check_positive(-1)
except MyCustomError as e:
print(f"自定义异常: {e}") # 输出: 自定义异常: 值不能为负数
4. 引发异常并附带链式调用
Python 3 支持通过 from
指定异常链:
try:
file = open("missing.txt")
except FileNotFoundError as e:
raise RuntimeError("文件操作失败") from e # 保留原始异常上下文
5. 引发多种异常类型
可以引发任何继承自 BaseException
的类:
raise TypeError("类型错误") # 内置异常
raise SystemExit(1) # 系统退出(不推荐随意使用)
关键点总结
- 用途:主动通知调用者错误情况,替代返回错误码。
- 异常对象:可以是内置异常或自定义异常(继承
Exception
)。 - 错误信息:建议通过字符串参数提供清晰描述。
- 异常链:用
raise ... from ...
保留上下文。
常见内置异常
异常类型 | 触发场景 |
---|---|
ValueError |
值不合法(如 int("abc") ) |
IndexError |
序列索引越界 |
KeyError |
字典键不存在 |
FileNotFoundError |
文件未找到 |
通过合理使用 raise
,可以提升代码的健壮性和可调试性。