03
异常处理 · 1 / 4
3.1 try / except:把可能出错的代码包起来
💡 一个用户的 prompt 把 GPU 干 OOM,你不想让其他用户的请求跟着 503
3.1 try / except
基本结构
try:
# 可能出错的代码
except 异常类型 as e:
# 出错时怎么办
finally:
# 不管出没出错都执行(可选)
常见异常类型
| 异常 | 触发场景 |
|---|---|
KeyError |
dict 取不存在的 key |
IndexError |
list 越界 |
ValueError |
类型对但值不合法(比如 int("abc")) |
TypeError |
类型用错了地方 |
ZeroDivisionError |
除以零 |
FileNotFoundError |
文件不存在 |
示范
try:
cfg = {"model": "qwen2.5-7b"}
print(cfg["temperature"])
except KeyError as e:
print(f"缺少字段: {e}")
✍️ 练习
写代码:
- 把一个 list
tokens = [101, 202, 303]当成 token id 列表 - 用
try / except包住:试图访问tokens[10](越界) - 捕获
IndexError,打印"请求超出范围: <错误信息>"
注意:打印时把 as e 里的 e 拼进字符串。
💡 思路提示
点开看提示
except IndexError as e:f"..."字符串里可以嵌入{e}把异常对象转字符串- 正常情况下
print(tokens[10])会崩,被 except 兜住就不会
✅ 参考解法
写不出来再打开
tokens = [101, 202, 303]
try:
print(tokens[10])
except IndexError as e:
print(f"请求超出范围: {e}")
🔍 进阶思考
捕获异常后“继续运行”比“直接崩”强,但别无脑 except Exception: 把所有异常都吃掉——真正的 bug 会被藏起来。
推理服务里的原则:
- 已知的失败(参数错、OOM、超时)→ 各自捕获,转成对应 HTTP 状态码
- 未知的失败 → 让它冒泡,记录全栈,等值班同学收到报警