Catch语句被完全忽略

时间:2011-08-03 15:41:54

标签: c++ exception

我遇到了一些我继承的代码的情况......老实说,我相信代码写得正确,但这个错误似乎仍然存在。

我会很快注意到代码是从linux到LynxOS的交叉编译,我不确定这是否与错误有关。

基本上,在一个特定情况下:

try {
    std::vector<ClassA> x = SomeGeneratingFunction();

    //We get to here fine.  X may be empty/unpopulated though.
    if (x.size() < 1)
    {
        throw(MyException("It crashed."));
    }
}
catch (MyException e)
{
    //Handle it.
}
catch (...)
{
    //Handle it.
}

我们抛出给定的向量是未填充的,但由于某种原因,抛出绕过catch子句 - 两者都是。它似乎只发生在这里 - 虽然我们通常不会形成一个if语句范围,但这应该是完全不相关的,因为它仍然在try范围内。

PS:下面的代码实际上是函数的内容,调用时函数会出现异常,即使它们都应该由catch块处理。

任何想法如何可能?是的,这不是真正的代码/异常类,但异常类是你重写std :: exception的谷歌的简单例子,而SomeGeneratingFunction()确实返回一个好的向量,即使它是空的。我无法提供真正的代码,但这是非常接近的,除非我可能已经把它写成了我的头顶。

6 个答案:

答案 0 :(得分:11)

由于catch (...)条款没有捕获异常,我的答案并没有解决OP的问题。但对于那些在SO上发现这个问题的人来说,也许我的答案是有用的,因为它解释了为什么第一次捕获失败。

我有一个类似的问题,我的catch(const std::exception& ex)无效。事实证明这是一个愚蠢的问题,因为我在C#和C ++异常之间切换,在C#中你需要在抛出异常时指定new,而在C ++中你通常不会(但是你)可以,但在这种情况下,你扔的是指针而不是引用)。我不小心做了

throw new std::runtime_error("foo");

所以

catch(std::exception*  ex)

会抓住它但

catch(std::exception& ex)

没有按&#39;吨。当然,解决方案只是删除新语句,因为这不是C ++中的传统设计模式。

答案 1 :(得分:1)

由于throw语句中的异常对象周围有一组备用括号,因此它看起来像是一个函数调用。您是否有可能定义了一个名为throw的函数?异常构造函数的参数使其不会成为Most Vexing Parse的受害者,但如果您的实际代码与您的示例不同,则可能存在这种情况。

答案 2 :(得分:0)

catch (MyException e)

应为:

catch (const MyException &e)

我不确定为什么你的投掷看起来像一个函数,有点奇怪。

编辑:

基于类似的东西,我遇到了捕获问题,但我同意这个玩具案例还不够。

编译器对我来说似乎是Try被定义为有趣的东西?如果它是空的,那么可能有意义,如果你的编译器忽略了catch语句而没有尝试。

答案 3 :(得分:0)

如果你在一个较小的范围内有一个函数 MyException(甚至可能是偶然的话,那么{3}}将throw MyException("It crashed")调用该函数并抛出返回值。

答案 4 :(得分:-1)

我只是在不使用try / catch的情况下重写它。无论如何,在这里使用try / catch似乎不合适。众所周知,例外可能不适用于您的目标平台。

答案 5 :(得分:-3)

让我来解决问题...除非你想要明确地崩溃程序,否则不要在C ++中使用异常。我知道异常可能非常有用,但它们的性能非常差,因为它会引发操作系统内核捕获的硬件异常。使用返回值和错误代码比抛出和捕获异常快500倍。