2008-10-28 45 views
2

我们正在尝试更新我们的应用程序,以便将其提交给Vista认证。部分要求是仅处理已知的异常,并使Windows错误报告处理所有未处理的异常。应用程序关闭和Windows错误报告

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

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

我们已经看过终止通过Environment.FailFast(),但我们不认为这给出了我们需要的异常信息。

我们是否错过了某些明显的东西?

回答

1

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

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

+0

是的,这实际上是我们开始的路线。我们担心WinQual会将所有这些异常看作是相同类型(新的外部异常),并将它们归类为同一问题,但我们需要进一步调查这一点。 – Graham 2008-10-28 15:06:47

-1

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

一个THROW E会重新启动整个异常堆栈,丢失原来的堆栈信息。通常情况下,这不是你想要的。

另一种方法是,您可以抛出一个新的异常并将原始异常添加为内部异常。然后你的新例外可以增加额外的信息。

0

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