尝试捕获不按预期工作

Joh*_*0te 8 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.
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

提前感谢任何想法!

-w00te

Mar*_*ata 11

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

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

throw new std::runtime_error("foo");
Run Code Online (Sandbox Code Playgroud)

所以

catch(std::exception*  ex)
Run Code Online (Sandbox Code Playgroud)

会抓住它但是

catch(std::exception& ex)
Run Code Online (Sandbox Code Playgroud)

没有.当然,解决方案只是删除新语句,因为这不是C++中的传统设计模式.