raise
raise 的本质#
raise = 触发异常 + 中断当前执行流 + 向上层传递错误plaintext基础语法#
1. 抛出异常实例(最常用)#
raise HTTPException(status_code=404, detail="Not found")
# └───────────┘ └─────────────────────────────┘
# 异常类 构造函数的参数python2. 抛出异常类(自动实例化)#
raise ValueError # 等价于 raise ValueError()
raise ValueError("msg") # 带消息的实例python3. 重新抛出当前异常(在 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 JSONplaintext与其他语言对比#
| 语言 | 语法 | 特点 |
|---|---|---|
| Python | raise ValueError("msg") | 必须抛异常对象或类 |
| Java | throw new Exception("msg") | 必须抛对象 |
| JavaScript | throw "msg" / throw new Error() | 可抛任何值 |
| Go | return 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 的错误信号弹,触发后立即中断当前执行,携带错误信息向上层传递,直到被捕获处理或导致程序终止。