如何重新抛出异常而不丢失原始调用堆栈?

6
情况如下:线程A捕获了一个异常,在异常过滤器中使用GetExceptionInformation将异常数据保存在内存中,之后线程B获取该异常信息并想要重新抛出它。但问题是,当线程B重新抛出被捕获的异常时,我丢失了导致异常的原始调用堆栈。怎样才能重新抛出异常而不丢失原始的调用堆栈呢?(请注意,本问题涉及C++)。

只是想确保我没有得到特定于C#的答案 :) - unknown
1
一些解决方案肯定是特定于语言/平台的。C++和C#异常确实有所不同,而且在不同的平台上实现C++异常也不同。 - Assaf Lavie
一个好的解决方案在这个stack overflow thread中被描述。 - Andrea Araldo
这个 stackoverflow帖子 中描述的解决方案可能非常适合您的需求。 - Andrea Araldo
2个回答

2

在 catch 块中解开堆栈并将其保存为您重新抛出的异常的一部分。在 C++ 中解开堆栈有点棘手,但您可以查看附带 WxWidgets 的崩溃转储收集器代码以获取示例。


0
问题是为什么需要将堆栈传递给“接收”线程。
我认为您需要堆栈以便将其报告到某个错误日志中。您可以在捕获线程中遍历堆栈,或生成迷你转储,或收集所需的任何错误信息,然后只需将异常的副本(如果可能,请注意切片)传递给接收线程即可。

我在一种fork-join例程中捕获了异常。因此,如果某个工作线程抛出异常,我想将其传递到主线程并在那里重新抛出它(+我不想丢失原始堆栈)。 - unknown

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