【问题标题】:Application Shutdown and Windows Error Reporting应用程序关闭和 Windows 错误报告
【发布时间】:2010-09-19 14:02:32
【问题描述】:

我们正在尝试更新我们的应用程序,以便提交它以获得 Vista 认证。部分要求是仅处理已知异常并让 Windows 错误报告处理所有未处理的异常。

我们的应用程序中有一个全局异常处理程序(订阅了Application.ThreadException 事件),在那里,我们对已知异常执行某些处理,但如果异常未知,我们希望将其抛出以使应用程序终止和 WER 来处理。

如果我们重新抛出然后重新创建调用堆栈,我们无法看到这样做并维护调用堆栈的方法。

我们已经考虑通过 Environment.FailFast() 终止,但我们认为这不会提供我们需要的异常信息。

我们是否遗漏了一些明显的东西?

【问题讨论】:

    标签: windows-error-reporting


    【解决方案1】:

    为什么不直接抛出一个新异常并将 InnerException 属性设置为未处理的?默认的 StackTrace 属性会将两个跟踪连接在一起。

    请记住,如果您从从 WinQual 检索到的内存转储中进行调试,那么它将是一个无论如何都会被捕获的本机异常。几乎总是可以返回本机​​堆栈并检索托管异常,如果您有可用的符号,通常很容易找出问题所在。在这种情况下,托管异常的堆栈跟踪无论如何都是多余的。

    【讨论】:

    • 是的,这实际上是我们开始的路线。我们担心 WinQual 会将所有这些异常视为同一类型(新的外部异常)并将它们归类为同一问题,但我们需要进一步调查。
    • 老实说,WinQual 中的分桶系统目前在托管异常方面似乎并不能很好地工作。至少这是我的经验。显然,微软正在考虑对其进行更新以改进分类。
    【解决方案2】:

    是的,但是我们在 Application.ThreadException 全局处理程序中,而不是一个 catch 块,所以我们不能只调用 throw,我们必须抛出 e.Exception。

    【讨论】:

      【解决方案3】:

      是的,正如 Marc 所说,只需使用 THROW,原始异常将被重新抛出,并保留堆栈跟踪信息。

      THROW E 将重新启动整个异常堆栈,而原始堆栈信息会丢失。通常这不是您想要的。

      您也可以抛出一个新异常并将原始异常添加为内部异常。然后,您的新例外可能会添加额外的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多