什么时候应该使用assert()?

时间:2010-09-13 16:19:59

标签: c++ assert

在与许多开发人员开发大型C ++编程项目时,我们遇到了在代码中不恰当地使用assert()的问题,这导致了断言确实发生并且产品崩溃的质量差。

问题是适用于使用assert()的好原则是什么?何时使用assert()以及何时不使用?是否有一个标准清单,每个断言应该通过才能合法?我们如何鼓励正确使用assert()?

作为第一个破解,我会说assert()只应用于记录一个被认为无法达到的条件,并且应该在运行时将其识别为assert()失败因为编程假设被违反而出现。

人们可以比这更好吗?你对assert()的体验是什么?

4 个答案:

答案 0 :(得分:11)

使用例外来处理来自 外部 (在方法外部或程序外部)的错误情况,例如参数检查和缺失/缺陷外部资源,如文件或连接或用户输入。

使用断言表示 内部 缺陷,例如编程错误,不应发生的情况,例如:类/方法不变量和无效的程序状态。

答案 1 :(得分:1)

您应该使用assert来检查所有不应发生的情况:

  • 输入参数的前提条件
  • 中间计算的结果
  • 对象状态的后置条件

但是,您应该仅在调试版本中或在为发布明确激活时(不在发布给客户的版本中)包含这些断言。

答案 2 :(得分:1)

我使用asserts来检查任何不需要的程序状态:

  • 功能前提条件
  • 有时我会在每次API调用后将它们插入到宏中:glDrawArray(); checkOpenGLError(); - 如果打开,checkOpenGLError()将调用getGLError()
  • 数据结构完整性:assert(某事== null);
  • 有时GDB对我而言(iOS SDK 3.2)。我使用断言来证明它。

编辑:

“不需要的程序状态”排除了在运行时自然发生的错误,例如由于权限或HD故障而无法打开用户选择的文件。在这些情况下,使用断言是不明智的。

答案 3 :(得分:0)

现在很多代码都有很多外部依赖关系和连接。这些天我不倾向于使用传统的断言,我赞成例外。我不觉得我可以假设“这种情况永远不会发生”,并且可以在非调试版本中安全地删除检查。