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无关(其例外很少是"特殊的").
另一个要考虑的因素 - 虽然 - 是用户数据无效但您无法对验证功能结果采取行动的情况:
return statement
,未能处理该False
值将导致您的无效数据被发送到管道,raise
遇到异常,则无法捕获它将导致异常传播通过堆栈最终导致代码停止.虽然第一种选择起初可能看起来很可怕,但它仍然是正确的道路:如果数据无效,那么将它传递到更远的线路是没有意义的...它很可能会在以后引入难以跟踪的错误在流程中,您也将错过修复代码中的错误的机会(无法对无效数据执行操作).
再次.使用异常是pythonic的方法(但它不适用于大多数其他语言),这也在其他答案和python的zen中说明:
错误不应该默默地传递.
除非明确沉默.
HTH!
如果输入有效或无效,则只返回布尔值.验证测试遇到无效值没有什么特别之处.