捕获所有异常并记录信息

Posted

技术标签:

【中文标题】捕获所有异常并记录信息【英文标题】:Catching all exceptions and logging information 【发布时间】:2012-05-10 07:25:07 【问题描述】:

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

我的代码结构如下:

try
...

catch( ... ) 

    log("Exception occurred");

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

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

catch(exception e)

    log(e.what());

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

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

【问题讨论】:

C 中没有“异常”之类的东西(至少在控制流机制的意义上没有)。 @Mankarse, std::exception 确实存在于 C++ 标准库中。对 Shailesh 来说,你可以使用 gdb 来调试此类非标准异常。 Getting the backtrace from the catch block 的可能重复项 @iammilind:这个问题之前被标记为 C,并谈到了在“C/C++”代码中处理异常处理。此后已对其进行了编辑,因为 Shailesh Tainwala 显然在编写 C++,而不是 C。 值得一提的是你应该把你的catch块放在catch(...)之前,你应该通过引用而不是通过值来捕捉 【参考方案1】:

首先,您应该通过引用来捕获(通常为 const),因此您的新 catch 块应为:

try 

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

如果现有的 catch-all 处理程序没有捕获异常,则抛出的异常根本不是 c++ 异常。【参考方案3】:

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

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

【讨论】:

如何从 catch-all 处理程序中获取有关发生异常的信息? @ShaileshTainwala:你不能,因此一开始就应该避免包罗万象。它只是隐藏你的问题,而不是解决它。你最好的办法是通过调试来确定哪里出了问题,那里不容易。 @Als:我从这个问题中得到,catch-all 确实捕获了异常。 @MatthieuM.:实际上我没有得到相同的结果,也许 OP 应该澄清一下。

以上是关于捕获所有异常并记录信息的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Java 中的异常记录尽可能多的信息?

Asp.NetCore依赖注入和管道方式的异常处理及日志记录

Asp.NetCore依赖注入和管道方式的异常处理及日志记录

Azure 函数应该记录错误还是抛出异常?

在iOS中捕获崩溃和异常[重复]

如何记录“捕获的”异常?