Python 中如何手动抛出(raise)异常?

Python 手动抛出异常用 raise 语句:raise ValueError("错误信息")。可抛出内置异常或自定义异常,支持 raise ... from ... 链式传递。

最佳实践
Python 中如何手动抛出(raise)异常?封面

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 ValueErrorraise ValueError("信息") 都可以。不带参数时异常信息为空字符串。

Q:assert 和 raise 有什么区别?
A:assert 条件, "信息" 等价于 if not 条件: raise AssertionError("信息")。assert 用于开发调试,python -O 模式下会被跳过;raise 用于正式的错误处理。

Q:能抛出字符串吗?
A:不能。raise "出错了" 会报 TypeError——只能抛出继承自 BaseException 的类的实例。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台