C ++异常处理程序的一个奇怪问题

时间:2008-11-26 03:18:49

标签: c++ exception

我在C ++中使用了标准的异常处理方法。哪个是try {}和catch {}阻止。在我的代码中,func1()会抛出异常,而func2就是这样:

bool func2()
{
    try{
       func1();
    }

    catch(myException& e)
    {
       cerr << "error!" << endl;
       return false;
    }
    return true;
}

但是当我运行我的代码时,会发生一件奇怪的事情。我从来没有达到抛出异常的代码,但我总是在catch块中到达返回false的行(但是cerr <<的行也从未到达)。然后函数继续返回true。我不知道原因是什么。任何人都可以帮我解决问题吗?非常感谢你!

8 个答案:

答案 0 :(得分:7)

如果您在编译器中使用任何优化标志(即非调试模式),则无法相信调试器会向您显示正确的执行行。你做了相互矛盾的陈述 - “return false”语句正在执行,但函数返回true。这是我能想到的唯一解释。

答案 1 :(得分:3)

正如@Mark Ransom所说,你可能已经启用了优化。为了帮助您理解goind是什么,这是编译器可能生成的代码的C ++等价物:

bool func2()
{
    bool ret;

    try{
       func1();
       ret = true;
    }

    catch(myException& e)
    {
       cerr << "error!" << endl;
       ret = false;
    }

    return ret;
}

但是,当您在生成的代码上的return ret;“行”时,原始代码中有两行行,您实际可以使用return false;return true;。调试器不知道哪个是正确的,因此它显示第一个(实际上,它是生成调试器将使用的表的编译器,这是选择)。

如果您告诉编译器生成一个程序集文件并查看它,这将更加明显。假设这是x86,其中返回值在%eax上,两个分支都将%eax设置为1或0然后跳转或下降到公共函数结尾代码(这是它将在哪里实际上从函数返回。)

答案 2 :(得分:0)

在WinDbg(或gdb)中打开您的应用,并启用第一次机会异常(在WinDbg中通过sxe eh)。

答案 3 :(得分:0)

你怎么知道它返回错误?如果func2没有执行cerr并返回true,则听起来没有捕获异常,并且没有执行返回false。

如果您正在使用调试器,有时它会显示您在没有抛出异常的情况下位于catch块的右括号上,这可能会让您感到困惑。

答案 4 :(得分:0)

如果您正在点击返回true语句,则抛出另一种类型的异常?尝试添加一个catch(...)。

答案 5 :(得分:0)

我注意到cerr有时会表现得很糟糕,你试过用cout取代cerr吗?也只是尝试在异常块中放置两个cout。

答案 6 :(得分:0)

如果没有产生输出且功能为RETURNING为真。

然后没有异常逃避func1() 结果该函数返回true。

但是您可能遇到的问题是,在优化代码之后,无法将机器指令映射回C ++源代码(因为优化器可能会重新安排代码)。

我建议您尝试使用以下内容,以确保报告所有异常。

试试这个:

bool func2()
{
    try
    {
         func1();
    }
    catch(MyException const& e)
    {
         std::cerr << "Error!: Cought My Exception\n";
         return false;
    }
    catch(...)  // Catch any other exceptions
    {
        std::cerr << "Error!: Unknown Exception detected\n";
        /*
         * To keep the same functionality of your original code
         * Rethrow the unknown exception.
         */
        throw;
    }
    return true;
}

答案 7 :(得分:-1)

使用调试模式,而不是优化模式。另外,请确保您没有写任何悬空指针。