c++ - cpp中的Assert函数与错误处理的区别
问题描述
我在网上参考了一些网站,这让我对这个功能感到好奇。一个站点建议使用 assert 作为函数前提条件,它可用于检测与并行线程期间数据操作相关的问题。但正如人们所说,断言应该在软件发布期间被删除。但是我们可以通过一个简单的 if else 和 exit 组合来检测这个问题。所以我不明白使用断言有什么不同。
解决方案
最后归结为您可以在程序中遇到两种(或更多)类型的“错误”:
如果您有一个文本字段并要求用户以“yyyy-mm-dd”格式输入日期,并且用户写“今天是星期二”。那么这是一种你可以捕捉和响应的错误——而且,这不是程序的问题。
另一方面,如果您有一个日期选择器(显示一个日历并让用户在那里选择),那么它应该只能返回有效日期(并且可能是一个“用户拒绝选择”值)。如果它可以返回“2020-14-52”,那么日期选择器代码就被破坏了。
如果您担心您的日期选择器可能被窃听(也许您正在编写自己的),那么您可以添加一些assert(validDate(date))
调用到您从选择器获得的所有日期返回。这样,每次日期选择器返回无效日期时,程序都会以一个大红色手指指向失败的断言而终止。这在开发过程中非常有价值。
但是,一旦您对日期选择器正常工作并且只返回有效日期感到满意,那么所有这些额外的检查都是多余的,可以删除。但是这里assert
还有另一个不错的功能;如果您在调试模式下编译,则检查保留,但如果您在发布模式下编译,则它变成一个可以由编译器优化的空调用。
简而言之:错误处理是针对在正常工作的程序中执行期间可能出错的内容。断言适用于不能出错的东西(如果确实出错,那么代码中的某些东西根本就被破坏了)。
推荐阅读
- excel - 如何让偏移范围在公式中起作用?
- c++ - 在向量 C++ 中查找多个最大元素
- postgresql - 如何从 PostgreSQL 中 JSONB 列内的数组中删除重复项?
- php - PHP无限循环将sql数据检索到html表
- protocol-buffers - 如何从 protobuf (.proto) 文件中生成 (.json/.yaml) 中的 swagger3 (OpenAPI3) 规范?
- r - 当使用向量获取数据帧的子集时,为什么结果行会偏移?
- sqlite - 函数定义为异步时不接受等待
- geoserver - Marklogic 和 Geoserver 集成不起作用
- r - 如何在包含某个字符串的最后一列之后添加一列?
- javascript - 如何将视频的 src 安全地放入变量中?