推理基础设施 · Python3.2 多个 except:按类型分别处理
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")
  • 如果 ab 不是数字(用 isinstance(x, (int, float)) 判断),捕获 TypeError,返回 None
  • 正常情况返回真实除法结果

测试三种情况:safe_div(10, 2)safe_div(10, 0)safe_div(10, "x"),并 print 结果。

💡 思路提示

点开看提示
  1. except (TypeError, ZeroDivisionError) 可以一次写多个,但题目要求分别处理
  2. isinstance(x, (int, float)) 一次判断多种类型
  3. 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 用法。生产代码里前置判断更常见(防御式编程)。