【发布时间】:2011-10-19 05:52:07
【问题描述】:
我遇到了一些我继承的代码的情况......老实说,我相信代码编写正确,但这个错误似乎仍然存在。
我会很快注意到代码是从 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.
}
鉴于向量未填充,我们 throw ,但由于某种原因,throw 绕过了 catch 子句——它们两者。它似乎只发生在这里 - 虽然我们通常不会在 if 语句范围内这样做,但这应该是完全不相关的,因为它仍在 try 范围内。
PS:下面的代码实际上是一个函数的内容,调用的时候会出现异常,尽管它们都应该由catch块处理。
您有什么想法吗?是的,这不是真正的代码/异常类,但异常类是您搜索的重载 std::exception 的简单示例,并且 SomeGeneratingFunction() 确实返回了一个好的向量,即使它是空的。我无法提供真正的代码,但除非我在脑海中写下任何小错别字,否则这非常接近。
【问题讨论】:
-
我不知道,但考虑将 catch 行写成 catch (const MyException& e) 以避免为 MyException 复制构造函数付费,因为您将获得throw 扔了。
-
如果你添加调试语句(在条件之前,在抛出之前和之后)它会改变行为吗?如果你把矢量从图片中取出怎么办?当你使用 'catch throw' 运行时,GDB 会做什么?你如何编译?尝试使用优化标志进行处理
-
调试语句按预期打印,不会改变行为。这是一个庞大的系统,具有复杂的 make 层次结构和在不同部分使用的许多标志 - 但更重要的是,我们在您应该(或尝试)的任何地方都使用 try catch 并且以前从未见过这种情况。我想也许交叉编译器可能会弄乱范围或类似的东西,但我对编译器知之甚少。我已经让几个人看过了——我们可以通过 if else 而不是 if/throw 来解决它,但是解决一些不应该发生的事情是令人担忧的
-
另外,你可以试试
x.empty()而不是x.size() < 1。 -
这里没有足够的信息来回答这个问题。我将发布的代码推送到
main函数中,添加了一些#include和MyException、ClassA和SomeGeneratingFunction和catch的一些最小定义@ 对我来说按预期工作。