推理基础设施 · Python3.3 else 与 finally
03
异常处理 · 3 / 4

3.3 else 与 finally

💡 finally 里几乎总是关文件、关连接、释放资源

3.3 else 与 finally

完整四段式

try:
    # 试跑
except 异常类型:
    # 出错兜底
else:
    # 没出错才执行
finally:
    # 不管出没出错都执行
  • try:试跑
  • except:出错兜底
  • else没出错才执行(容易忘,挺好用)
  • finally不管出没出错都执行(清理资源)

推理服务里 finally 用来

  • 关 GPU 锁
  • 记录 metrics
  • 关 HTTP 连接
  • 释放显存引用

示范

def load_model(path):
    try:
        return open(path)
    except FileNotFoundError:
        print("模型文件不存在,使用默认配置")
        return None
    else:
        print("模型加载成功")
    finally:
        print("load_model 函数结束")

load_model("/nope")     # 文件不存在 + 清理完成
load_model("ok.txt")    # 加载成功 + 清理完成(前提有 ok.txt)

✍️ 练习

写一个函数 parse_token_count(payload)

  • payload 形如 {"tokens": 128}
  • try 里尝试返回 payload["tokens"]
  • except KeyError:返回 0,打印 "missing tokens, using 0"
  • else:打印 "parsed ok, tokens=<n>"
  • finally:打印 "parse_token_count done"

测试两个输入:{"tokens": 128}{}

💡 思路提示

点开看提示
  1. else 的作用是“成功路径”里才跑逻辑,避免和 except 混在一起
  2. finally 不管成功失败都会跑,常用于打日志、做清理
  3. 函数最后可以没有 returnNone 也会被 print 成 None

✅ 参考解法

写不出来再打开
def parse_token_count(payload):
    try:
        n = payload["tokens"]
    except KeyError:
        print("missing tokens, using 0")
        return 0
    else:
        print(f"parsed ok, tokens={n}")
        return n
    finally:
        print("parse_token_count done")

print(parse_token_count({"tokens": 128}))
print(parse_token_count({}))

🔍 进阶思考

else 看着鸡肋,但当你想在“成功路径”里再跑一段逻辑、又不想让 try 块变长时,它就是分层的利器。

更推荐的形式:让 try 块尽量只放可能出错的最小代码,成功后的处理挪到 else