c – 在try catch块中断言

前端之家收集整理的这篇文章主要介绍了c – 在try catch块中断言前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在为一段代码添加处理,以便它不会崩溃.目前,每个步骤都有一个ASSERT语句,以确保在上一步中没有出错.如果在其中一个步骤中出现问题,则确实出现了问题.该计划应该停止.

虽然在发布模式下程序命中了一个断言,但是快乐地继续前进并崩溃.

为了解决这个问题,我已经将方法包装在try / catch块中,并在以前的断言处抛出错误.这应该记录我们跟踪的所有错误以及其他我们没有记录的错误.

现在我的问题是,我是否还应该使用断言通知程序员这不应该发生?或者现在它们会因为catch块(我清理对象)而不会崩溃?

或者我应该在catch块中而不是每个throw语句中抛出一个断言?

解决方法

尝试& catch和assert有完全不同的目的(至少在我看来).

try和catch用于处理预期的错误条件(用户提供了一个不存在的文件名,调用new无法分配内存,用户输入某种类型的无效输入等).

断言的目的是保证程序员不会犯错误.希望在发布时运行代码时,您已经涵盖了这些替代方案,并且知道代码“很好”.断言的典型示例是用户不应提供的某些指针,因为NULL确实不是NULL,或者链表具有预期的节点数[例如,你计算remove_node之前的节点数,并检查节点数确实少一个].

如果您不是100%确定(或者至少98.75%确定或您认为“足够好”的任何级别),那么您已经测试了所有代码,那么您不应该发布 – 或者如果您这样做,请获得您的质量保证经理签署“我们没有做足够的测试,但我们对此感到满意”.

try和catch应该只用于你的程序可以可靠地恢复的东西.不要抓住“程序员编写导致崩溃的愚蠢代码”.

编辑以澄清实际答案:

换句话说,是的,你应该使用assert来处理代码中你不希望发生的事情[至少如果程序员没有做错的话] – 这包括例如检查向量内部的向量例如,当你期望有一个方形矩阵或者指针不是NULL时,矩阵确实是一个正方形[除了你期望它们的位置 – 甚至可能在它们应该是时检查它们是否为空].

您还应该使用try / catch进行错误检查,并在出现问题时抛出,这可能在“现实生活”中运行实际程序期间发生 – 磁盘已满(或只读),文件不存在,内存不足,那种事情.

猜你在找的C&C++相关文章