我遇到了一些我继承的代码的情况...老实说,我相信代码是正确编写的,但这个错误似乎仍然很明显。
我很快就会注意到代码是从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块来处理。
你知道这是怎么实现的吗?是的,这不是真正的代码/异常类,但exception类是您谷歌重载std::exception的简单示例,并且SomeGeneratingFunction()确实返回了一个很好的向量,即使它是空的。我不能提供真正的代码,但这是非常接近的,除非有任何小的打字错误,我可能会把它从我的头顶。
发布于 2014-10-21 05:47:17
因为catch (...)子句没有捕捉到异常,所以我的答案不能解决OP的问题。但对于其他发现这个问题的人来说,也许我的答案是有用的,因为它解释了为什么第一个catch失败了。
我也遇到过类似的问题,我的catch(const std::exception& ex)就是不能工作。这被证明是一个愚蠢的问题,因为我在C#和C++异常之间切换,在C#中,当你抛出异常时,你需要指定new,而在C++中,你通常不需要指定(但你可以,但在这种情况下,你抛出的是一个指针,而不是引用)。我不小心做了
throw new std::runtime_error("foo");所以
catch(std::exception* ex)会被抓到,但是
catch(std::exception& ex)当然,解决方案就是删除新的语句,因为这不是C++中的传统设计模式。
发布于 2011-08-04 00:50:59
由于throw语句中的异常对象周围有一组空闲的圆括号,因此它看起来像是一个函数调用。有没有可能定义了一个名为throw的函数?异常构造函数的参数可以防止它成为Most Vexing Parse的牺牲品,但如果您的实际代码与示例不同,就有可能发生这种情况。
发布于 2011-08-03 23:45:31
catch (MyException e)应为:
catch (const MyException &e)我也不确定为什么你的抛出看起来像一个函数,有点奇怪。
编辑:
我在基于类似东西的捕获方面遇到了问题,尽管我同意在这个玩具箱中这是不够的。
对我来说,编译器似乎关闭了,Try被定义为有趣的东西吗?如果它是空的,那么如果您的编译器忽略catch语句而不尝试,这可能是有意义的。
https://stackoverflow.com/questions/6929239
复制相似问题