cpp中Assert函数与错误处理的区别

Difference between Assert function in cpp and error handling

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

归根结底,您可能会在程序中遇到两种(或更多)“错误”:

如果您有一个文本字段并要求用户以“yyyy-mm-dd”格式输入日期,而用户输入“It is tuesday”。那么这是一种您可以捕获并响应的错误 - 而且,它不是程序的错误。

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

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

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

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