这是一个非常古老的问题,但由于唯一的答案 - IMO - 不适用于 Python,所以我的看法如下。
Python 中的异常是许多刚接触该语言的程序员难以处理的问题。与其他语言相比,Python 在异常的使用方式上有很大的不同:事实上Python 经常使用异常来进行流控制。
典型的例子是for
循环:你肯定会同意循环耗尽它的迭代并没有什么“特别奇怪”的(事实上,所有循环都是这样做的,除非被破坏)......但是而不是提前检查是否还有值为了处理,Python 不断尝试从可迭代对象中读取值,如果失败,则会引发StopIterator
异常,这反过来又被for
表达式捕获并使代码退出循环。
此外,在 Python 中使用EAFP(它比 Permission = 更容易请求宽恕try-except
)而不是 LBYL(在你跳跃之前查看 = if not A, B or C then
)是惯用的。
在这方面,csj 的答案对于 C 或 Java 是正确的,但与 Python 无关(它们的异常在本质上很少是“异常”的)。
另一个需要考虑的因素 - 虽然 - 是用户数据无效但您未能对验证函数结果采取行动的情况:
- 使用 a
return statement
,未能处理该False
值将导致您的无效数据沿管道发送,
- 相反,如果您
raise
遇到异常,未能捕获它会导致异常通过您的堆栈传播,最终导致您的代码停止。
虽然第二个选项一开始可能看起来很吓人,但它仍然是正确的选择:如果数据无效,则将其进一步传递是没有意义的……它很可能会在以后引入难以跟踪的错误在流程中,您也将错过修复代码中的错误的机会(未能对无效数据采取行动)。
再次。使用异常是pythonic的做法(但它不适用于大多数其他语言),正如其他答案和python zen中所述:
错误永远不应该悄无声息地过去。
除非明确沉默。
!