validate方法应该抛出异常吗?

dea*_*mon 7 python validation error-handling exception

我已经实现了一个小验证库,使用如下:

domain_object.validate()

# handle validation errors in some way ...
if domain_object.errors:
    for error in domain_object.errors:
        print(error)
Run Code Online (Sandbox Code Playgroud)

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

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

什么方法更好?抛出验证异常是否有利?

Cod*_*ray 8

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

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

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

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

  • 在使用Python编程时,我几乎没有这样的肯定.虽然大多数语言社区都是如此,但Python开发人员倾向于遵循[EAFP原则](http://tinyurl.com/PyEAFP).它在语言中如此普遍,即使是原生的,语法支持的结构也遵循这个原则 - 参见例如[`StopIteration`例外](http://tinyurl.com/StopIteration),它标志着迭代器的结束,甚至是`for`循环知道.所以,是的,流控制和验证的异常的使用是Python中推荐和广泛使用的习惯用法. (8认同)

Fel*_*arz 5

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

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