【Python】 try except 还是 if else(EAFP 还是 LBYL 风格)
结论
● 若超过95%的可能不会进入except异常处理中,则使用代码一的样式(EAFP风格)
● 否则可以换成用代码二的样式(LBYL风格)
代码一(EAFP风格):
try: 判断代码 except 错误: 普通代码
代码二(LBYL风格):
if 判断代码: 普通代码 else: 普通代码
名词解释
EAFP (Easier to Ask for Forgiveness than Permission)
先try,反正出错也无所谓,except会出手
LBYL (Look Before You Leap)
想好再写,if else 安排上
分析
众所周知,在Python中,自带的 try except 这种异常处理语句比较"重",也就是性能不太好
但是,官方却推荐使用 EAFP (Easier to Ask for Forgiveness than Permission) 代码编写风格,也就是官方推荐使用 try except
那为啥不使用 LBYL (Look Before You Leap) 编写风格呢,也就是为啥不直接用 if else 这种简单明了性能还OK的方式呢
事实上,try 的性能并不差,不仅不差,还非常好,不输于 if else
但是 except 捕获异常却非常消耗性能!
所以,
● 如果绝大多数情况下,不会进入异常处理分支的话,使用 try except 更好 EAFP
● 如果部分情况下,会进入异常处理分支,那么换不换无所谓,都是一个量级的时间消耗,谁也别瞧不起谁
● 如果大部分情况下,会进入异常处理分支,那么建议直接换成 if else LBYL
测试
比如最常遇见的 KeyError 异常,即:想访问字典中的某个键的值,但字典中没有这个值,就报这个错
EAFP 风格就是:直接访问这个键值对,有问题了用except捕获
LBYL 风格就是:先判断这个键是否存在于字典中,再进行访问
用官方库的计时工具的测试结果如下:(setup里面是初始化一些变量的操作,stmt里面是需要计时的代码)
其实就可以看出来:
● 性能上:直接从字典内取值 ≈ 判断键是否在字典内
● 性能上:直接从字典内取值 优于 try里面直接从字典内取值(不进入except) 优于 先判断键是否存在于字典中再进行访问
那结论就是:
● try 的性能并不差,不仅不差,还非常好,不输于 if else
● except 捕获异常的性能很不好
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现