首页 > 解决方案 > cpp中的Assert函数与错误处理的区别

问题描述

我在网上参考了一些网站,这让我对这个功能感到好奇。一个站点建议使用 assert 作为函数前提条件,它可用于检测与并行线程期间数据操作相关的问题。但正如人们所说,断言应该在软件发布期间被删除。但是我们可以通过一个简单的 if else 和 exit 组合来检测这个问题。所以我不明白使用断言有什么不同。

标签: c++assert

解决方案


最后归结为您可以在程序中遇到两种(或更多)类型的“错误”:

如果您有一个文本字段并要求用户以“yyyy-mm-dd”格式输入日期,并且用户写“今天是星期二”。那么这是一种你可以捕捉和响应的错误——而且,这不是程序的问题。

另一方面,如果您有一个日期选择器(显示一个日历并让用户在那里选择),那么它应该只能返回有效日期(并且可能是一个“用户拒绝选择”值)。如果它可以返回“2020-14-52”,那么日期选择器代码就被破坏了。

如果您担心您的日期选择器可能被窃听(也许您正在编写自己的),那么您可以添加一些assert(validDate(date))调用到您从选择器获得的所有日期返回。这样,每次日期选择器返回无效日期时,程序都会以一个大红色手指指向失败的断言而终止。这在开发过程中非常有价值。

但是,一旦您对日期选择器正常工作并且只返回有效日期感到满意,那么所有这些额外的检查都是多余的,可以删除。但是这里assert还有另一个不错的功能;如果您在调试模式下编译,则检查保留,但如果您在发布模式下编译,则它变成一个可以由编译器优化的空调用。

简而言之:错误处理是针对在正常工作的程序中执行期间可能出错的内容。断言适用于不能出错的东西(如果确实出错,那么代码中的某些东西根本就被破坏了)。


推荐阅读