03
异常处理 · 2 / 4
3.2 多个 except:按类型分别处理
💡 推理失败原因不同,处理方式也应该不同:OOM 该重试、参数错误不该重试
3.2 多个 except
从上往下匹配,第一个命中就处理
try:
do_something()
except ValueError:
handle_bad_value()
except KeyError:
handle_missing_key()
except Exception as e:
handle_unknown(e) # 兜底
推理服务里的真实例子
ValueError(参数错)→ 返回 400,告诉客户端修请求torch.cuda.OutOfMemoryError→ 释放显存,返回 503- 别的异常 → 记日志、报警
Exception 写在最后做兜底,能挡住 90% 没预料到的崩溃。
示范
def parse_size(s):
try:
return int(s)
except ValueError:
print(f"非法整数: {s}")
return None
print(parse_size("123")) # 123
print(parse_size("abc")) # 非法整数: abc → None
✍️ 练习
写一个函数 safe_div(a, b),返回 a / b:
- 如果
b == 0,捕获ZeroDivisionError,返回float("inf") - 如果
a或b不是数字(用isinstance(x, (int, float))判断),捕获TypeError,返回None - 正常情况返回真实除法结果
测试三种情况:safe_div(10, 2)、safe_div(10, 0)、safe_div(10, "x"),并 print 结果。
💡 思路提示
点开看提示
except (TypeError, ZeroDivisionError)可以一次写多个,但题目要求分别处理isinstance(x, (int, float))一次判断多种类型float("inf")表示正无穷大
✅ 参考解法
写不出来再打开
def safe_div(a, b):
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
try:
return a / b
except TypeError:
return None
try:
return a / b
except ZeroDivisionError:
return float("inf")
print(safe_div(10, 2)) # 5.0
print(safe_div(10, 0)) # inf
print(safe_div(10, "x")) # None
🔍 进阶思考
其实可以前置判断类型不抛异常——题目是为了让你练 except 用法。生产代码里前置判断更常见(防御式编程)。