Are try except clauses idiomatically discouraged in Python when avoidable?
如果可以避免,并且是正常运行的代码的一部分,那么在Python中是否不鼓励使用try-except子句?例如,在下面的两个代码片段中,哪一个是首选的?
选项1:
1 2 3 4 5 6
| try:
id = list.index(42)
except:
print("42 not found")
else:
print("ID:", id) |
选项2:
1 2 3 4 5
| if 42 in list:
id = list.index(42)
print("ID:", id)
else:
print("42 not found") |
- 不,他们不是。python中推荐的设计原则是eafp,而不是lbyl,请参见python词汇表。
- 仅供参考:EAFP:比许可更容易请求宽恕,而LBYL:在你跳之前先看一看。
- 实际上,除了简单的检查,程序可能还有更多的问题。事实上,鼓励尝试/捕获,并被视为良好的做法。
- 关于好的python风格的主题——不要用标准类型名命名变量,尽管这可能很诱人。所以没有名为"list"、名为"dict"、名为"tuple"的元组或名为"str"的字符串的列表。
- @paulmcguire你甚至不应该命名字符串list,dicts str,或列出dict:p
- 尝试一下这是找出某件事是否有效的最好方法。list.index()比你更可能知道什么是有效的。
他们并不气馁。
然而,您的示例是愚蠢的,因为您不需要异常,例如,您可能会意外地在您的list.index代码中出现拼写错误,这将触发异常,您永远不会知道。
如果您知道要捕获什么异常,就使用异常并捕获它们——并且执行"在跳跃之前查看"检查(就像在您的示例中一样)并不容易。通常情况并非如此。然而,在您的示例中是这样的。
哦,试着避免一个覆盖的except:捕获(特别是如果你知道你如何期望你的try失败)。这很容易导致坏的做法,因为根据定义,你几乎不知道你的电话可能会做什么/提高。如果您的应用程序需要这样做(例如Paul在注释中指出的服务器示例),那就可以了,但是如果您试图在列表中查找值?那是。。。不好的。
举一个很好的例子来说明为什么这个组合不适合您的例子:
1 2 3 4 5 6
| try:
id = list.idex(42)
except:
print("42 not found")
else:
print("ID:", id) |
- 我不同意。except Exception:是不可避免的,通常用于服务器应用程序,以避免由于代码行为不好而导致长时间运行的服务崩溃。要避免的情况是赤裸裸的except:,甚至更糟的是except: pass,它抓住了所有的例外,然后愉快地继续前进。致命的是,except:也捕捉到了你通常想让它通过的异常,比如键盘中断(当点击^ c)或系统退出时,except: pass在一段时间内,真正的循环将使程序难以终止。
- @保尔·麦奎尔,我澄清说,当我第一次写这篇文章的时候,我错误地把Exception:放在了except:而不是except:上……
一切取决于您的需求:
如果您对性能有很大的依赖性,则不鼓励使用try--except条款。
否则,可以使用try--except子句作为清晰的模式。
无论如何,在您的示例中,我认为if--else代码比try--except代码更清晰。