另外,当出现问题时,它与抛出异常相比如何?
另外,当出现问题时,它与抛出异常相比如何?
VERIFY()
和ASSERT()
(或标准库中的assert()
)的作用相同——让您捕获那些真的不应该发生的事情(即真正的代码漏洞,在发布之前需要修复的问题)。如果由于某种原因表达式为false,那么没有继续下去的必要,因为出现了非常严重的问题。
这反映在VERIFY()
只在Debug模式下编译时停止程序并显示错误信息—在Release模式下,它是透明的。 VERIFY()
和ASSERT()
的区别在于,VERIFY()
在Release模式下仍会评估表达式,但它不关心结果——而ASSERT()
在编译Release模式时完全从程序中删除,因此其中的表达式副作用将不会发生。
异常更适用于可能出错但可以从中恢复的情况,因为异常可以由程序的其他部分处理。
assert(false)
这样,通常用于检查switch的分支是否被捕获。我通常在处理我不确定行为的第三方代码时使用断言。对于正在开发中的自己代码的行为检查,我通常更喜欢使用单元测试。
现在,正如Schroëdinger教给我们的那样,测量会改变事物。您可能有时会有调试模式下工作但启用assert时停止工作的代码。这通常是断言条件中隐藏错误的症状(副作用、时间敏感代码)。verify可以最大限度地减少这种风险,但它可能被认为是一种不良实践,就像在地毯下清除灰尘。
对于您还没有设置真正错误处理的地方,也可以使用verify进行快速编码。我认为您不应该让任何verify进入生产代码中。
一般来说,异常应该由能够合理处理它们的最近对象捕获。
同时,并非所有异常都应该被视为致命错误并停止程序。想象一下,你正在处理一个通过异常返回错误情况的网络视频流库。如果库抛出一个“丢帧”的异常警告,你通常不希望停止程序,而只是为下一帧做好准备。
即使最好的做法是停止程序,你也不应该让异常自行处理(在生产代码中更不应使用assert达到这个目的)。应该始终存在一个顶级异常处理程序,用于这个目的,明确调用exit()之类的函数。如果没有这样做,仅表明程序员不关心可能发生的情况,很可能没有考虑过。
ASSERT
和VERIFY
。ASSERT
完全从程序中删除:它根本不评估表达式。另一方面,VERIFY
仍然评估表达式,只是忽略结果。assert()
并在发布模式下使用异常的自定义宏)。ASSERT()
中,然后不必担心在发布模式下的性能损失。 - Amber