捕获所有异常并记录信息

5

我是一名使用Java编程语言处理C++代码的程序员,需要在异常处理方面寻求帮助。

我的代码结构如下:

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

发生了异常,但try块非常庞大,无法进行调试,因此我需要对代码进行最小限度的修改,以便在异常上提供相关信息。

所以我在现有catch块之前添加了以下catch块(根据我的Java知识和C ++指南):

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

然而,我仍然收到旧信息 - "发生异常"。尝试块中的代码包含许多低级函数,如strncpy,memcpy等。
为什么这个catch块没有按预期工作?我该怎么做才能获取有关正在发生的异常和哪行代码的信息,类似于Java轻松提供的堆栈跟踪。

1
@Mankarse,std::exception在C++标准库中确实存在。对于Shailesh,您可以使用gdb来调试此类非标准异常。 - iammilind
可能是从catch块获取回溯信息的重复问题。 - BЈовић
@iammilind:这个问题之前被标记为C,并讨论了在“C/C ++”代码中处理异常处理的问题。自那时以来,它已经被编辑过了,因为Shailesh Tainwala显然是在写C++,而不是C。 - Mankarse
1
值得一提的是,您应该将catch块放在catch(...)之前,而且应该通过引用而不是值进行捕获。 - Alessandro Teruzzi
抱歉,你是正确的,我错过了它。 - Alessandro Teruzzi
显示剩余2条评论
3个回答

6

首先,您应该使用引用(通常为const)进行捕获,因此您的新catch块应该是:

try {

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

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

由于您来自Java,我建议您检查一下是否错误地使用了throw new XXXX,这将抛出一个指针(指向动态分配的值),而不是一个值。在C++中,new是不必要的。


3
也许是因为这些异常不是从exception类派生的。在C++中,任何类型都可以作为异常,例如stringint等。无论如何,如果您想捕获exception,您应该捕获对exception &的引用。

如果现有的全局异常处理程序无法捕获该异常,则抛出的异常根本不是C++异常。 - Alok Save

2

您需要调试并确定异常是否为C++异常。
请注意,例如被0除等运行时异常不受C++支持,因此它可能是任何东西。

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


我该如何从全捕获处理程序中获取有关发生异常的信息? - Shailesh Tainwala
3
@ShaileshTainwala:你不能使用“全捕获”语句,最好避免使用它,因为这只会掩盖问题而不是解决问题。你最好通过调试确定出错的原因,没有简单的方法。 - Alok Save
@Als:我从问题中得知,catch-all 捕获了异常。 - Matthieu M.
@MatthieuM:实际上我没有得到相同的结果,也许楼主应该澄清一下。 - Alok Save

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接