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} 和 {}。
💡 思路提示
点开看提示
else的作用是“成功路径”里才跑逻辑,避免和 except 混在一起finally不管成功失败都会跑,常用于打日志、做清理- 函数最后可以没有
return,None也会被 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。