断言失败后我应该返回吗?

时间:2013-11-18 04:52:32

标签: c++ error-handling assert

我应该:

void func(some* ptr)
{
    ASSERT(ptr);

    ptr->do();
}

void func(some* ptr)
{
    if (ptr == NULL)
    {
        ASSERT(0);
        return;
    }

    ptr->do();
}

P.S。 assert是我们自制的版本,而非默认版本 这是一个不返回的版本,在生产模式下变为noop

我更喜欢第一个,代码更简单,更短,并且没有不必要的代码。
但是第一个,我只能在开发模式中检测到错误 当然,我应该在开发过程中杀死所有错误,但如果在生产上线后发生某种未经测试的情况,即ptr真的变为NULL,则func失败。
< / p>

因此,第二部分的优点是我可以在开发和生产模式中检测错误并保证不会发生崩溃 但缺点是这段代码看起来很混乱,如果我们永远不会ptr == NULL,那就变得不必要了。

那么我应该使用哪种方式?

2 个答案:

答案 0 :(得分:2)

如果您想检查生产中的错误,我建议不要在生产模式下使用成为noop的内容。您必须决定是否要在生产中保存周期并消除断言,或者让它们进入并经历轻微的性能损失。没有妥协,它是 - 或者。

那就是说,你应该使用第一种形式;第二种形式是怪异的,凌乱的,并没有做你认为它做的事情。您应该使用宏而不是函数,这样如果您决定将它们关闭,即使是函数调用仍然存在;一个noop函数调用仍然需要时间。

最后,我要问:您使用自制assert的原因是什么?原始断言已包含switching it off的可能性。

答案 1 :(得分:1)

第二个版本实际上并未检测到生产版本中的错误。它静静地返回,造成各种难以诊断的破坏。如果要检测生产中的断言失败,请在生产中打开断言。