glownight

返回

raise 的本质#

raise = 触发异常 + 中断当前执行流 + 向上层传递错误
plaintext

基础语法#

1. 抛出异常实例(最常用)#

raise HTTPException(status_code=404, detail="Not found")
#     └───────────┘  └─────────────────────────────┘
#       异常类           构造函数的参数
python

2. 抛出异常类(自动实例化)#

raise ValueError          # 等价于 raise ValueError()
raise ValueError("msg")   # 带消息的实例
python

3. 重新抛出当前异常(在 except 块中)#

try:
    risky()
except:
    print("记录日志")
    raise   # ← 不加参数,把捕获的异常继续向上抛
python

执行流程:程序如何”炸”#

正常执行流 ─────────────────────────►


         遇到 raise


    ┌─────────────────┐
    │  创建异常对象      │
    │  携带错误信息      │
    └─────────────────┘


    ┌─────────────────┐
    │  中断当前函数      │  ◄── 后面代码不执行!
    │  开始向上层逃逸    │
    └─────────────────┘


    每层检查: 有 try-except? ──► 有 → 捕获处理
              │                    │
              无                    ▼
              │              继续向上层逃逸

         到达最顶层


         程序崩溃/500错误
plaintext

代码示例:层层逃逸#

# 第3层:最底层,抛出异常
def get_item(item_id):
    if item_id > 10:
        raise HTTPException(status_code=404, detail="Not found")
    return item_id

# 第2层:中间层,继续抛(或处理)
def process(item_id):
    result = get_item(item_id)  # ← 这里可能收到异常
    return result * 2

# 第1层:最上层,最终处理
@app.get("/items/{item_id}")
async def read_item(item_id: int):
    try:
        value = process(item_id)   # ← 异常向上传到这儿
        return {"value": value}
    except HTTPException:
        raise                      # ← 再抛给 FastAPI 处理
python

调用 read_item(99) 的执行栈:

get_item(99) 中 raise HTTPException

        ▼ 向上逃逸
process(99) 的 get_item(item_id) 调用点

        ▼ 继续向上
read_item(99) 的 process(item_id) 调用点

        ▼ 被 try-except 捕获
except HTTPException 捕获到

        ▼ 重新 raise
FastAPI 异常处理器捕获 → 返回 404 JSON
plaintext

与其他语言对比#

语言语法特点
Pythonraise ValueError("msg")必须抛异常对象
Javathrow new Exception("msg")必须抛对象
JavaScriptthrow "msg" / throw new Error()可抛任何值
Goreturn err无 raise,显式返回错误

高级用法#

异常链(保留原始错误)#

try:
    int("not a number")
except ValueError as e:
    raise HTTPException(400, "Invalid ID") from e
#     └────────────────────────────────────────┘
#              新异常 ← 原始异常
python

效果: 日志显示完整链条:

HTTPException: Invalid ID
caused by ValueError: invalid literal for int()
plaintext

自定义异常 + raise#

class BusinessError(Exception):
    def __init__(self, code, message):
        self.code = code
        self.message = message

# 使用
raise BusinessError(1001, "库存不足")
python

关键记忆点#

raise = 扔出一个"炸弹"

        ├── 立即炸停当前函数

        ├── 携带错误信息向上飞

        └── 直到被 try-except 接住,或炸毁程序
plaintext

一句话总结#

raise 是 Python 的错误信号弹,触发后立即中断当前执行,携带错误信息向上层传递,直到被捕获处理或导致程序终止。

raise
作者 glownight
发布于 2026年1月16日