如何在非抛出异常时保留堆栈跟踪

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

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; }));
}

并重新抛出异常,从而失去堆栈跟踪。

是否有任何(简单)的方法来解决这个问题(我可以在异常准备好切换线程时始终打包堆栈跟踪,但这似乎很麻烦)?

注意:我看到了这个主题,但它仅在标题中相似,而不是内容。


通常的做法是抛出一个新的异常,并将原始InnerException包含为InnerExceptionException有一个特殊的构造函数。

但是,如果您真的想要这样做,并且使用.Net 4.5,则可以使用ExceptionDispatchInfo来捕获ExceptionDispatchInfo的堆栈跟踪,然后在不重置堆栈跟踪的情况下将其重新推向其他位置。 但在大多数情况下,使用旧的包装例外的方法可能会更好。

链接地址: http://www.djcxy.com/p/69133.html

上一篇: How can I preserve the stack trace when exception is thrown on non

下一篇: UML State Machines, Local vs. External Transition