gpt4 book ai didi

c++ - 在 try catch block 中断言

转载 作者:可可西里 更新时间:2023-11-01 17:05:11 26 4
gpt4 key购买 nike

我目前正在对一段代码添加处理以使其不会崩溃。目前它有每个步骤,然后是一个 ASSERT 语句,以确保上一步没有出错。如果这些步骤中的某个步骤出了问题,那确实是出了大问题。该程序应该停止。

虽然在 Release模式下程序遇到断言,但愉快地继续运行并崩溃。

为了解决这个问题,我将方法包装在一个 try/catch block 中,并在断言所在的位置抛出错误。这应该捕获我们跟踪的所有错误和我们没有跟踪的其他错误。

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

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

最佳答案

try & catchassert 具有完全不同的目的(至少在我看来)。

trycatch 用于应对预期的错误情况(用户提供了一个不存在的文件名,调用 new 无法分配内存,用户输入无效某种输入等)。

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

如果您不能 100% 确定(或至少 98.75% 确定或您认为“足够好”的任何水平)您已经测试了所有代码,那么您不应该发布 - 或者如果您这样做,让您的质量保证经理签署“我们没有做足够的测试,但我们对此表示满意”。

trycatch 应该只用于您的程序可以可靠地恢复的事情。不要捕获“程序员编写了导致崩溃的愚蠢代码”。

编辑以澄清实际答案:

换句话说,是的,您应该将 assert 用于您不希望在代码中发生的事情 [至少如果程序员没有做错事情] - 这包括例如,当您希望有一个方阵时,检查矩阵 vector 中的 vector 是否确实是一个正方形,或者指针不是 NULL [除非您期望它们是 - 和甚至可以在它们应该是的时候检查它们是否为 NULL]。

当出现错误时,您还应该使用 try/catchthrow 进行错误检查,这些错误很可能在实际运行过程中发生“现实生活”中的程序——磁盘已满(或只读)、文件不存在、内存不足,诸如此类。

关于c++ - 在 try catch block 中断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28973904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com