验证方法应该抛出异常吗?

8 投票
2 回答
6142 浏览
提问于 2025-04-16 22:16

我做了一个小的验证库,可以这样使用:

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

不,我觉得验证方法不应该抛出异常。

这样做会形成一种反模式,因为调用这个方法的代码会合理地期望抛出一个异常,然后就需要去捕获这个异常。一般来说,不建议用异常来控制程序流程,那为什么不直接返回一个值,表示验证是否成功呢?调用的代码可以检查这个返回值,然后根据结果继续执行。

这样做的效果和抛出异常是一样的,但没有抛出异常带来的额外开销和不太好的语义。

异常应该留给真正的特殊情况,而不是程序的正常操作。验证失败对我来说似乎是一个相当正常的情况,是在应用程序日常运行中可以预见的事情。调用代码可以轻松处理这种情况,程序的正常操作可以继续进行。通常情况下,异常并不是这样处理的。

撰写回答