在“验证”类中使用异常或返回状态代码更好吗?

时间:2010-09-08 20:04:13

标签: python validation exception status

假设我正在创建一个类来验证数字,例如美国的“社会保障”(仅作为基于国家/地区的ID的示例)。有一些规则可以验证来自网站html表单输入的这个数字。

我考虑在Python中创建一个简单的类,以及一个公共validate方法。这个validate简单地返回TrueFalse。此方法将调用其他小型私有方法(例如,如果存在不同的规则,则为第一个“x”数字),每个方法也会返回TrueFalse

由于这很简单,我只考虑使用布尔状态代码(如果它有效或不有效,则不需要有关错误的有意义的消息)。

我一直在阅读some articles about using exceptions,我希望在我的情况下了解你的观点:使用例外是不是一个好主意?

2 个答案:

答案 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)

如果输入有效或无效,则只返回布尔值。验证测试遇到无效值没有什么特别的。