【问题标题】:How rethrow an exception without losing the original call stack?如何在不丢失原始调用堆栈的情况下重新抛出异常?
【发布时间】:2010-12-26 00:25:19
【问题描述】:

情况如下:线程A捕获异常,将异常的数据保存在内存中的某个位置(使用异常过滤器中的GetExceptionInformation),然后线程B获取该异常信息并想重新抛出它。但问题是,当线程 B 重新抛出捕获的异常时,我错过了导致异常的原始调用堆栈。
如何在不丢失原始调用堆栈的情况下重新引发异常? (注意这个问题是关于 C++ 的)。

【问题讨论】:

  • 只是想确保我没有得到特定于 C# 的答案 :)
  • 一些解决方案绝对是特定于语言/平台的。 C++ 和 C# 异常确实不同,C++ 异常在不同平台上的实现方式也不同。
  • 这个stack overflow thread中描述了一个很好的解决方案
  • stackoverflow post 中描述的解决方案可能对您的需求非常有用。

标签: c++ windows exception exception-handling


【解决方案1】:

问题是为什么需要将堆栈传递给“接收”线程。

我假设您需要堆栈以便基本上将其报告给一些错误日志。您可以在捕获线程中遍历堆栈,或者生成一个小型转储,或者您希望收集的任何错误信息,然后只需将异常的副本(如果可能,请注意切片)传递给接收线程。

【讨论】:

  • 我在一种 fork-join 例程中捕获的异常。所以如果在某个工作线程中抛出异常,我想将它传递给主线程并在那里重新抛出它(+我不想丢失原始堆栈)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2011-06-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多