我们正在尝试更新我们的应用程序,以便将其提交给Vista认证。部分要求是仅处理已知异常,并使Windows错误报告处理所有未处理的异常。
我们的应用程序中有一个全局异常处理程序(订阅了Application.ThreadException
事件),在那里,我们对已知异常执行某些处理,但是如果异常未知,我们希望将其抛出给应用程序终止和WER处理。
如果我们重新抛出然后重新创建调用堆栈,我们无法看到这样做并保持调用堆栈的方法。
我们已经考虑通过Environment.FailFast()
终止,但我们不相信这会提供我们需要的异常信息。
我们是否遗漏了一些明显的东西?
答案 0 :(得分:1)
为什么不抛出一个新的异常并将InnerException属性设置为未处理的属性?默认的StackTrace属性将两个跟踪连接在一起。
请记住,如果您从从WinQual检索到的内存转储进行调试,那么无论如何它都将成为本机异常。几乎总是可以回到本机堆栈并检索托管异常,如果有符号可用,通常很容易找出出错的地方。无论如何,在这种情况下,托管异常的堆栈跟踪将是多余的。
答案 1 :(得分:0)
是的,但是我们在Application.ThreadException全局处理程序中,而不是catch块,因此我们不能只调用throw,我们必须抛出e.Exception。
答案 2 :(得分:-1)
是的,正如Marc所说,只需使用THROW,原始异常将被重新抛出,并保留堆栈跟踪信息。
THROW E将重新启动整个异常堆栈,原始堆栈信息丢失。通常这不是你想要的。
替代方法是,您可以抛出一个新异常并将原始异常添加为内部异常。然后,您的新异常可能会添加额外的信息。