【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 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端