【发布时间】:2011-05-20 01:50:06
【问题描述】:
这里之前已经讨论过重新抛出异常的正确方法。相反,这个问题是关于如何在使用 rethrow 时从 Visual Studio 中获得有用的行为。
考虑这段代码:
static void foo() {
throw new Exception("boo!");
}
static void Main(string[] args) {
try {
foo();
} catch (Exception x) {
// do some stuff
throw;
}
}
出现的异常具有正确的堆栈跟踪,显示 foo() 作为异常的来源。 然而,GUI 调用堆栈窗口只显示 Main,而我希望它显示异常的调用堆栈,一直到 foo。
当没有重新抛出时,我可以使用 GUI 快速导航调用堆栈以查看导致异常的调用以及我们是如何到达那里的。
通过重新抛出,我希望能够做同样的事情。相反,GUI 显示的调用堆栈对我没有用。我必须将异常详细信息复制到剪贴板,将其粘贴到记事本中,然后手动导航到我感兴趣的调用堆栈的任何函数。
顺便说一句,如果我添加 [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] 或将捕获更改为 catch (Exception),我会得到相同的行为。
我的问题是:鉴于我的代码使用了 rethrow,有人可以建议一种方便的方法来导航与异常相关的调用堆栈吗?我正在使用 Visual Studio 2010。
【问题讨论】:
-
为什么要重新抛出异常?
catch子句中是否还有更多您未在此处包含的代码?否则,我认为您的解决方案是根本不捕获异常。 -
罗伯特,这是一个最小的 sn-p 来说明问题。实际代码在重新抛出之前做了一些工作。
标签: c# .net visual-studio exception