推理基础设施 · Python3.1 try / except:把可能出错的代码包起来
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}")

✍️ 练习

写代码:

  1. 把一个 list tokens = [101, 202, 303] 当成 token id 列表
  2. try / except 包住:试图访问 tokens[10](越界)
  3. 捕获 IndexError,打印 "请求超出范围: <错误信息>"

注意:打印时把 as e 里的 e 拼进字符串。

💡 思路提示

点开看提示
  1. except IndexError as e:
  2. f"..." 字符串里可以嵌入 {e} 把异常对象转字符串
  3. 正常情况下 print(tokens[10]) 会崩,被 except 兜住就不会

✅ 参考解法

写不出来再打开
tokens = [101, 202, 303]
try:
    print(tokens[10])
except IndexError as e:
    print(f"请求超出范围: {e}")

🔍 进阶思考

捕获异常后“继续运行”比“直接崩”强,但别无脑 except Exception: 把所有异常都吃掉——真正的 bug 会被藏起来。

推理服务里的原则:

  • 已知的失败(参数错、OOM、超时)→ 各自捕获,转成对应 HTTP 状态码
  • 未知的失败 → 让它冒泡,记录全栈,等值班同学收到报警