9

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

我想在 Python 中创建一个简单的类和一个公共validate方法。这简单地validate返回TrueFalse。此方法将调用其他小的私有方法(例如,如果有不同的规则,则用于第一个“x”数字),每个方法都返回TrueFalse

由于这真的很简单,我正在考虑仅使用布尔状态代码(如果它有效与否,不需要关于什么是错误的有意义的消息)。

我一直在阅读一些关于使用异常的文章,我想知道您对我的情况的看法:使用异常会是一个好主意吗?

4

2 回答 2

11

这是一个非常古老的问题,但由于唯一的答案 - 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中所述:

错误永远不应该悄无声息地过去。

除非明确沉默。

于 2012-08-09T23:09:38.783 回答
6

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

于 2010-09-08T20:08:52.537 回答