5

我是一名使用 C++ 代码的 Java 程序员,需要一些异常处理方面的帮助。

我有以下结构的代码:

try{
...
}
catch( ... ) 
{
    log("Exception occurred");
}

发生了异常,但 try 块确实很大,调试不是一种选择,因此我需要对代码进行最低限度的修改,以便为我提供有关异常的相关信息。

因此,我在现有的 catch 块之前添加了以下 catch 块(使用我的 Java 知识并参考 C++ 指南):

catch(exception e)
{
    log(e.what());
}

但是,我仍然收到旧消息 - “发生异常”。try 块中的代码包含许多低级函数,例如strncpy, memcpy等。

为什么这个catch块没有按预期工作?我可以做些什么来获取有关正在发生的异常以及发生在哪一行的信息,类似于 Java 如此容易提供的堆栈跟踪。

4

3 回答 3

6

首先,你应该通过引用来捕获(通常是 const),所以你的新catch块应该是:

try {

} catch(std::exception const& e) {
    log(e.what());
} catch(...) {
    log("Exception occurred");
}

其次,在 C++ 中你可以抛出任何值。甚至类型int。如果你的代码库中包含这样不精通的throw语句,我很同情你。

由于您来自 Java,因此我会检查您是否错误地使用了 a throw new XXXX,它会抛出一个指针(指向动态分配的值)而不是一个值。在newC++ 中是不必要的。

于 2012-05-10T08:04:05.777 回答
3

可能是因为这些异常不是从exception类派生的。在 C++ 中,任何类型都可以是异常,例如string,int等。无论如何,如果您想捕获exception,您可能应该捕获对exception &.

于 2012-05-10T07:27:55.637 回答
2

您必须调试并确定异常是否为 C++ 异常。
请注意,除以0etc 是 C++ 不支持的运行时异常,因此它可以是任何字面意思。

一个包罗万象的处理程序只会捕获有效的 C++ 异常,而不是所有异常(可能很多)。

于 2012-05-10T07:28:21.160 回答