7

这样做是不好的形式,因为它不保留堆栈跟踪:

try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
    throw e; // ...Use "throw;" by itself instead
}

但是,如果在非 UI 线程上捕获到异常,我想将其提升回 UI 并处理它,以便用户收到如下消息:

try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
    Dispatcher.Invoke((Action)(() => { throw; }));
}

但是,我不能在这里单独使用 throw 关键字,因为 C# 词法分析器(正确地)认为throw语句不在catch中。我必须这样做:

try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
    Dispatcher.Invoke((Action)(() => { throw e; }));
}

并重新抛出异常,该异常会丢失其堆栈跟踪。

有什么(简单的)方法可以解决这个问题(我总是可以在异常准备好切换线程时打包堆栈跟踪,但这似乎很狡猾)?

注意:我看到了这个帖子,但它只是标题相似,而不是内容。

4

1 回答 1

4

通常的方法是抛出一个的异常,原始的包含为InnerException. Exception对此有一个特殊的构造函数

但是如果你真的想这样做并且你在.Net 4.5上,你可以使用ExceptionDispatchInfo捕获异常的堆栈跟踪,然后在其他地方重新抛出它而不重置堆栈跟踪。但在大多数情况下,使用旧方法将异常包装在新方法中可能会更好。

于 2013-02-01T20:00:48.307 回答