在与许多开发人员开发大型C ++编程项目时,我们遇到了在代码中不恰当地使用assert()的问题,这导致了断言确实发生并且产品崩溃的质量差。
问题是适用于使用assert()的好原则是什么?何时使用assert()以及何时不使用?是否有一个标准清单,每个断言应该通过才能合法?我们如何鼓励正确使用assert()?
作为第一个破解,我会说assert()只应用于记录一个被认为无法达到的条件,并且应该在运行时将其识别为assert()失败因为编程假设被违反而出现。
人们可以比这更好吗?你对assert()的体验是什么?
答案 0 :(得分:11)
使用例外来处理来自 外部 (在方法外部或程序外部)的错误情况,例如参数检查和缺失/缺陷外部资源,如文件或连接或用户输入。
使用断言表示 内部 缺陷,例如编程错误,不应发生的情况,例如:类/方法不变量和无效的程序状态。
答案 1 :(得分:1)
您应该使用assert来检查所有不应发生的情况:
但是,您应该仅在调试版本中或在为发布明确激活时(不在发布给客户的版本中)包含这些断言。
答案 2 :(得分:1)
我使用asserts来检查任何不需要的程序状态:
glDrawArray(); checkOpenGLError();
- 如果打开,checkOpenGLError()将调用getGLError()编辑:
“不需要的程序状态”排除了在运行时自然发生的错误,例如由于权限或HD故障而无法打开用户选择的文件。在这些情况下,使用断言是不明智的。
答案 3 :(得分:0)
现在很多代码都有很多外部依赖关系和连接。这些天我不倾向于使用传统的断言,我赞成例外。我不觉得我可以假设“这种情况永远不会发生”,并且可以在非调试版本中安全地删除检查。