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

Som*_*DOS 7 python validation exception status

假设我正在创建一个类来验证一个数字,比如美国的"社会保障"(仅作为基于国家的身份证的一个例子).有一些规则可以验证此数字来自网站中html表单中的输入.

我考虑在Python中创建一个简单的类,以及一个公共validate方法.这validate将返回True或者False,干脆.此方法将调用其他小的私有方法(如果存在不同的规则,则为第一个'x'数字),每个方法都返回True或者False也是如此.

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

我一直在阅读一些关于使用异常的文章,我希望在我的情况下了解你的观点:使用异常是一个好主意吗?

mac*_*mac 10

这是一个非常古老的问题,但由于唯一的答案 - IMO - 不适用于Python,因此我接受了它.


Python中的异常是许多程序员对该语言不熟悉的事情.与其他语言相比,Python在如何使用异常方面存在显着差异:事实上,Python通常使用异常进行流控制.

规范的例子是for循环:你肯定会同意循环耗尽它的迭代没有任何"独特的奇怪"(事实上这就是所有循环所做的,除非被破坏)......而不是提前检查是否仍有值为了处理,Python继续尝试从迭代中读取值,并且失败,导致StopIterator异常上升,而异常又被for表达式捕获并使代码退出循环.

此外,在Python中使用EAFP(比请求更容易要求宽恕= try-except)而不是LBYL(在你跳跃之前看看)是惯用的if not A, B or C then.

在这方面,csj的答案对于C或Java是正确的,但与Python无关(其例外很少是"特殊的").

另一个要考虑的因素 - 虽然 - 是用户数据无效但您无法对验证功能结果采取行动的情况:

  • 使用a return statement,未能处理该False值将导致您的无效数据被发送到管道,
  • 相反,如果您raise遇到异常,则无法捕获它将导致异常传播通过堆栈最终导致代码停止.

虽然第一种选择起初可能看起来很可怕,但它仍然是正确的道路:如果数据无效,那么将它传递到更远的线路是没有意义的...它很可能会在以后引入难以跟踪的错误在流程中,您也将错过修复代码中的错误的机会(无法对无效数据执行操作).

再次.使用异常是pythonic的方法(但它不适用于大多数其他语言),也在其他答案pythonzen中说明:

错误不应该默默地传递.

除非明确沉默.

HTH!


csj*_*csj 5

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

  • `引发NeitherValidNorInvalidException('D:')` (3认同)
  • 好吧,进一步扩大.假设我有一个使用该值的方法,例如ErasePersonalIdentity(ssn),那么ssn应该有效是合理的.如果提供了无效的ssn,那么提出InvalidSSNException将是合适的.关键是,如果操作需要有效输入,则在提供无效输入时应触发异常.如果操作正在验证输入,则没有异常. (2认同)
  • 是现货.请记住,如果你想要一个异常,你总是可以`断言Validator.is_valid(ssn)`. (2认同)