假设我正在创建一个类来验证一个数字,比如美国的"Social Security“(就像一个基于国家的id的例子)。这里有一些规则来验证这个数字,它来自网站中html表单中的输入。
我在考虑用Python语言创建一个简单的类和一个公共的validate方法。此validate简单地返回True或False。此方法将调用其他小的私有方法(例如,如果有不同的规则,则调用第一个'x‘数字),每个方法也返回True或False。
因为这真的很简单,所以我考虑只使用布尔状态码(无论它是否有效,都不需要关于错误的有意义的消息)。
我一直在阅读some articles about using exceptions,我想知道你对我的情况的看法:使用异常是一个好主意吗?
发布于 2010-09-09 04:08:53
如果输入有效或无效,则只需返回布尔值。验证测试遇到无效值并没有什么异常。
发布于 2012-08-10 07:09:39
这是一个非常古老的问题,但由于唯一的答案- IMO -不适用于Python,下面是我对它的看法。
Python中的异常是许多编程新手很难处理的问题。与其他语言相比,Python在异常的使用方式上有很大的不同:实际上,Python经常使用异常来进行流控制。
典型的例子是for循环:您肯定会同意,循环耗尽其迭代并没有什么“奇特”之处(事实上,这就是循环所做的,除非被破坏)……然而,Python并没有提前检查是否还有要处理的值,而是继续尝试从迭代器中读取值,如果不成功,就会引发StopIterator exception,然后for表达式会捕获该值,并使代码退出循环。
此外,在Python语言中,使用Leap EAFP权限(请求宽恕比=try-except更容易)而不是LBYL (在使用Leap之前先看一下= if not A, B or C then)是惯用的。
在这一点上,csj的答案对于C或Java是正确的,但对于Python (其异常在本质上中很少是“异常”的)来说是无关的。
但是,另一个需要考虑的因素是用户数据无效,但您未能对验证函数结果采取行动的情况:
对于具有return statement的
False值,将导致无效数据沿管道向下发送,反之,如果您要捕获异常,则无法捕获它将导致异常在堆栈中传播,最终导致代码暂停。虽然第二种选择一开始可能看起来很可怕,但它仍然是正确的道路:如果数据是无效的,那么进一步传递它是没有意义的……它很可能会在以后的流程中引入难以跟踪的bug,而且您还会错过修复代码中的bug的机会(无法对无效数据执行操作)。
再来一次。使用异常的是 pythonic way to do (但它不适用于大多数其他语言),在this other answer和zen of python中也有说明
错误永远不应该静默地传递。
除非明确地保持沉默。
哈!
https://stackoverflow.com/questions/3671450
复制相似问题