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 在当前处理异常的上下文重新抛出该异常,无活动异常时会抛 RuntimeError。raise ValueError 则创建一个新的无参数异常实例,与裸 raise 不同。

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

Q:能抛出字符串吗?
A:不能。raise "出错了" 会报 TypeError——可抛出 BaseException 子类或其实例;直接抛类时 Python 会无参数实例化它。

[1]: 观测云文档《应用性能监控 APM》https://www.guance.com/product/application-performance-monitoring

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台