验证方法应该抛出异常吗?
我做了一个小的验证库,可以这样使用:
domain_object.validate()
# handle validation errors in some way ...
if domain_object.errors:
for error in domain_object.errors:
print(error)
validate()
这个函数会进行检查,并把错误信息放到一个叫 errors
的列表里。
我知道其他一些验证库在验证失败的时候会抛出异常,也就是错误信息会作为异常的一个属性传递。
那么,哪种方法更好呢?抛出验证异常有什么好处吗?
2 个回答
7
我认为应该完全相反:在验证层,你需要确保每一个验证错误都能被处理。如果你只依赖返回值,可能会在集成代码中出现错误(特别是当你在不同的环境中使用验证器时)。
使用Python的异常处理可以让这个问题变得很明显。
12
不,我觉得验证方法不应该抛出异常。
这样做会形成一种反模式,因为调用这个方法的代码会合理地期望抛出一个异常,然后就需要去捕获这个异常。一般来说,不建议用异常来控制程序流程,那为什么不直接返回一个值,表示验证是否成功呢?调用的代码可以检查这个返回值,然后根据结果继续执行。
这样做的效果和抛出异常是一样的,但没有抛出异常带来的额外开销和不太好的语义。
异常应该留给真正的特殊情况,而不是程序的正常操作。验证失败对我来说似乎是一个相当正常的情况,是在应用程序日常运行中可以预见的事情。调用代码可以轻松处理这种情况,程序的正常操作可以继续进行。通常情况下,异常并不是这样处理的。