Python 中如何手动抛出(raise)异常?
Python 手动抛出异常用 raise 语句:raise ValueError("错误信息")。可抛出内置异常或自定义异常,支持 raise ... from ... 链式传递。
用 raise 语句:raise ValueError("错误信息")。选择合适的内置异常类型(ValueError/TypeError/KeyError 等),或抛出自定义异常类。
基本用法
def calculate_payment(amount, payment_type):
if payment_type not in ("Visa", "Mastercard"):
raise ValueError(f"不支持的支付方式: {payment_type}")
if amount <= 0:
raise ValueError("金额必须大于 0")
# 正常计算...
try:
calculate_payment(100, "Discover")
except ValueError as e:
print(f"参数错误: {e}")
常用内置异常类型
| 异常 | 适用场景 |
|---|---|
ValueError |
参数值不合法 |
TypeError |
参数类型不对 |
KeyError |
字典键不存在 |
IndexError |
索引越界 |
FileNotFoundError |
文件不存在 |
PermissionError |
权限不足 |
RuntimeError |
通用运行时错误 |
NotImplementedError |
子类必须实现的方法 |
链式异常(raise ... from ...)
try:
int("abc")
except ValueError as e:
raise RuntimeError("解析配置失败") from e
from e 保留原始异常链,打印堆栈时能看到两层信息,便于排查。
重新抛出
try:
risky_operation()
except Exception:
logger.exception("操作失败")
raise # 记录日志后重新抛出,让上层处理
常见问题(FAQ)
Q:raise 后面可以不跟参数吗?
A:raise ValueError 和 raise ValueError("信息") 都可以。不带参数时异常信息为空字符串。
Q:assert 和 raise 有什么区别?
A:assert 条件, "信息" 等价于 if not 条件: raise AssertionError("信息")。assert 用于开发调试,python -O 模式下会被跳过;raise 用于正式的错误处理。
Q:能抛出字符串吗?
A:不能。raise "出错了" 会报 TypeError——只能抛出继承自 BaseException 的类的实例。