捕获所有异常并记录信息

Catching all exceptions and logging information

本文关键字:记录 信息 异常      更新时间:2023-10-16

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

我有以下结构的代码:

try{
...
}
catch( ... ) 
{
    log("Exception occurred");
}
发生了异常,

但try块确实很大,调试不是一种选择,所以我需要最低限度地修改代码以提供有关异常的相关信息。

所以我在现有的 catch 块

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

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

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

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

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

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

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

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

可能是因为这些异常不是从exception类派生的。在C++任何类型都可以是例外,例如stringint等。无论如何,如果你想抓住exception你可能应该抓住对exception &的引用。

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

捕获全部处理程序将仅捕获有效C++异常,而不是所有异常(这可能很多)。