我已经实现了一个像这样使用的小验证库:
domain_object.validate()
# handle validation errors in some way ...
if domain_object.errors:
for error in domain_object.errors:
print(error)
validate()
执行检查并填充名为errors
的列表。
我从其他验证库中知道,如果执行验证失败,它们会抛出异常。错误消息将作为异常属性传递。
哪种方法更好?抛出验证异常是否有利?
答案 0 :(得分:8)
不,我认为验证方法不应该抛出异常。
这会产生一些反模式,因为调用该方法的客户端代码会合理地期望抛出异常,然后需要捕获异常。由于通常建议不将异常用于流控制,为什么不返回指示验证是否成功的值。客户端代码可以检查返回值并相应地继续。
你基本上可以通过抛出异常来完成同样的事情,但是没有实际抛出异常的额外成本和糟糕的语义。
应该为真正的例外条件保留例外,而不是程序的正常操作。对我的验证失败似乎是一个非常正常的条件,在应用程序的日常操作期间期望。它可以通过调用代码轻松处理,并且正常操作将继续。一般情况下,例外并非如此。
答案 1 :(得分:5)
我认为恰恰相反:在验证层中,您希望确保处理每个验证错误。如果您依赖返回值,则集成代码中可能存在错误(特别是在不同环境中使用验证器时)。
Python异常会使问题变得明显。