validate方法应该抛出异常吗?

时间:2011-07-26 09:46:05

标签: python validation exception error-handling

我已经实现了一个像这样使用的小验证库:

domain_object.validate()

# handle validation errors in some way ...
if domain_object.errors:
    for error in domain_object.errors:
        print(error)

validate()执行检查并填充名为errors的列表。

我从其他验证库中知道,如果执行验证失败,它们会抛出异常。错误消息将作为异常属性传递。

哪种方法更好?抛出验证异常是否有利?

2 个答案:

答案 0 :(得分:8)

不,我认为验证方法不应该抛出异常。

这会产生一些反模式,因为调用该方法的客户端代码会合理地期望抛出异常,然后需要捕获异常。由于通常建议不将异常用于流控制,为什么不返回指示验证是否成功的值。客户端代码可以检查返回值并相应地继续。

你基本上可以通过抛出异常来完成同样的事情,但是没有实际抛出异常的额外成本和糟糕的语义。

应该为真正的例外条件保留例外,而不是程序的正常操作。对我的验证失败似乎是一个非常正常的条件,在应用程序的日常操作期间期望。它可以通过调用代码轻松处理,并且正常操作将继续。一般情况下,例外并非如此。

答案 1 :(得分:5)

我认为恰恰相反:在验证层中,您希望确保处理每个验证错误。如果您依赖返回值,则集成代码中可能存在错误(特别是在不同环境中使用验证器时)。

Python异常会使问题变得明显。