捕获所有异常和记录信息

时间:2012-05-10 07:25:08

标签: c++ exception-handling try-catch

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

我有以下结构的代码:

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

正在发生异常,但try块非常庞大,调试不是一个选项,所以我需要对代码进行最低限度的修改,以便为异常提供相关信息。

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

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

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

为什么此catch块无法正常工作?我该怎么做才能获得有关正在发生的异常以及哪一行的信息,类似于Java很容易给出的堆栈跟踪。

3 个答案:

答案 0 :(得分:4)

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

try {

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

其次,在C ++中你可以抛出任何值。即使是int类型。如果你的代码库包含了这些不公正的throw语句,我可怜你。

由于你来自Java,我会检查你是否错误地使用了throw new XXXX,它会抛出指针(动态分配的值)而不是值。在C ++中不需要new

答案 1 :(得分:3)

可能是因为这些例外不是来自exception类。在C ++中,任何类型都可以是例外,例如stringint等。无论如何,如果要捕获exception,您应该可以捕获对exception &的引用。

答案 2 :(得分:2)

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

catch-all处理程序只捕获有效的C ++异常,而不是所有异常(可能很多)。