首先,性能差异可能很大。在一个项目中,我们的断言确实导致了 3 倍的减速。但他们帮助我们发现了一些非常讨厌的错误。
这正是重点。
断言可以帮助您捕获错误。而且由于它们在发布版本中被删除,我们可以负担得起大量放入而不用担心性能。如果你不在那里对任何失败的断言采取实际行动,它们就会变得毫无价值,所以我们不妨删除它们。
即使捕获错误并抛出异常也不是真正的解决方案。程序逻辑有缺陷,即使我们处理了异常,程序仍然是坏的。
断言基本上归结为“为什么要费心去捕捉你无法处理的错误?”
在开发过程中必须捕获一些错误。如果他们滑过测试并进入客户使用的发布版本,程序就会被破坏,再多的运行时错误检查也无法修复它。
我从来没有断言的想法——你为什么要使用它们?
我的意思是,假设我是一名方程式赛车手,所有的断言都是安全带、头盔等。
是的,这是什么时候不使用断言的一个很好的例子。这些是在运行时实际上可能出错的事情,需要检查。你的一级方程式车手可能会忘记一些安全预防措施,如果他忘记了,我们希望在任何人受伤之前停止整个事情。
但是检查引擎是否已安装呢?我们需要在比赛期间检查吗?
当然不是。如果我们在没有引擎的情况下参加比赛,我们就完蛋了,即使我们发现了错误,也为时已晚。
相反,这是一个必须在开发过程中捕获或根本不捕获的错误。如果设计人员忘记在他们的汽车中安装发动机,他们需要在开发过程中检测到这个错误。这是一个断言。开发的时候跟开发者有关系,但是后面的错误一定是不存在的,如果存在,我们也无能为力。
这基本上就是区别。一个例外是通过处理可以处理的错误来帮助用户。
断言可以帮助您,通过提醒您首先决不能发生的错误,必须在产品发货之前修复这些错误。不依赖于用户输入的错误,而是依赖于你的代码做它应该做的事情。
四的平方根决不能计算为三。错误是根本不可能的。如果确实发生了,那么您的程序逻辑就被破坏了。我们围绕它进行多少错误处理并不重要,它是必须在开发过程中捕获的东西,或者根本不捕获。如果我们使用异常处理来检查这个错误并处理它,异常会做什么?告诉用户“程序从根本上坏了。永远不要使用它”?
来自开发人员的电子邮件可以实现这一点。为什么要费心将其构建到程序代码中?这是一个根本不能发生的问题的例子。如果是这样,我们必须返回并修复程序。没有其他形式的错误处理是可能的。
但是可能会出现一些错误,例如无法打开文件进行读取。即使它发生可能是一件坏事,但我们必须接受它可能发生。因此,如果确实如此,我们需要处理它。
断言用于捕获不可能发生的错误。