假设我正在创建一个类来验证数字,例如美国的“社会保障”(仅作为基于国家/地区的ID的示例)。有一些规则可以验证来自网站html表单输入的这个数字。
我考虑在Python中创建一个简单的类,以及一个公共validate
方法。这个validate
简单地返回True
或False
。此方法将调用其他小型私有方法(例如,如果存在不同的规则,则为第一个“x”数字),每个方法也会返回True
或False
。
由于这很简单,我只考虑使用布尔状态代码(如果它有效或不有效,则不需要有关错误的有意义的消息)。
我一直在阅读some articles about using exceptions,我希望在我的情况下了解你的观点:使用例外是不是一个好主意?
答案 0 :(得分:10)
这是一个非常古老的问题,但由于唯一的答案 - IMO - 不适用于Python,因此我接受了它。
Python中的异常是许多程序员对该语言不熟悉的事情。与其他语言相比,Python在如何使用异常方面存在显着差异:实际上 Python通常使用流程控制的异常。
规范的例子是for
循环:你肯定会同意循环耗尽它的迭代没有任何“独特的奇怪”(事实上这就是所有循环所做的,除非破坏)...而不是提前检查是否还有值要处理,Python继续尝试从迭代中读取值,如果失败,则会升高StopIterator
exception,而this other answer又会被{{1表达式并使代码退出循环。
此外,Python中的惯用语是 EAFP (它更容易要求宽恕而不是权限= for
)而不是LBYL(在你跳跃之前看看= {{1 }})。
在这方面,csj的答案对于C或Java是正确的,但与Python无关(其中例外很少是“例外”的)。
另一个要考虑的因素 - 尽管如此 - 是用户数据无效但您无法对验证功能结果采取行动的情况:
try-except
,未能处理if not A, B or C then
值将导致您的无效数据被发送到管道中,return statement
出现异常,则无法捕获它会导致异常在堆栈中传播,最终导致代码停止。虽然第一种选择最初可能看起来很可怕,但它仍然是正确的道路:如果数据无效,那么将它传递到更远的路线是没有意义的...它很可能会引入难以实现的目标。在流程中跟踪错误,你也将错过修复代码中的错误的机会(无法对无效数据采取行动)。
再次。 使用例外是 pythonic 的做法(但它不适用于大多数其他语言),如zen of python和{{3}}中所述:
错误绝不应该以无声方式传递。
除非明确沉默。
HTH!
答案 1 :(得分:5)
如果输入有效或无效,则只返回布尔值。验证测试遇到无效值没有什么特别的。