c++ - 断言总是不好的吗?

标签 c++ exception assertions

我曾经在一家公司工作,其中一些首席架构师/开发人员在各种项目中强制要求不得使用断言,并且通常会从代码中删除它们并用异常替换它们。

我觉得它们对于编写正确的代码非常重要。任何人都可以建议如何证明这样的授权是合理的吗?如果是这样,断言有什么问题?

最佳答案

根据 JaredPar 的评论,我们使用了修改后的 assert 版本,其作用类似于契约(Contract)。此版本被编译到发布代码中,因此存在较小的开销,但除非设置了诊断开关,否则将被禁用,从而将性能开销降至最低。在这种情况下,我们的断言处理程序可以设置为禁用、静默模式(例如,记录到文件)或嘈杂模式(例如,使用 abort/ignore 在屏幕上显示,abort 会引发异常)。

我们在预发布测试中使用了自动化回归测试,并且断言在这里非常重要,因为它们使我们能够发现无法在 GUI 级别发现的潜在内部错误,并且在最初可能不会致命用户级别。通过自动化,我们可以在有和没有诊断的情况下运行测试,除了执行时间之外几乎没有开销,因此我们还可以确定断言是否有任何其他副作用。

使用断言要小心的一件事是副作用。例如,您可能会看到类似 assert(MyDatabasesIsOk()) 的内容,它会无意中更正数据库中的错误。这是一个错误,因为断言不应该改变正在运行的应用程序的状态。

关于c++ - 断言总是不好的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419406/

相关文章:

c++ - 在Visual C++中使用MessageBoxW输出多个相加的字符串

c++ - Linux 中的看门狗定时器

c++ - CDockablePane 重启程序后不调整大小

C++ ODBC 未处理的异常/访问冲突写入位置

Clojure 条件映射参数作为 arglist 的元数据提供

swift - Swift 中的前提条件和测试它们

c++ - DirectX 11 : Use UpdateSubresource to update Vertex and Index buffers

Android改造转换器异常

java - 断言 java 中私有(private)方法抛出异常的另一种方法

javascript - 断言对象的排序数组