繁体   English   中英

在非UI线程上抛出异常时,如何保留堆栈跟踪

[英]How can I preserve the stack trace when exception is thrown on non-UI thread

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

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#lexer(正确)认为throw语句不在catch中 我不得不这样做:

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

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

是否有任何(简单)方法来解决这个问题(我总是可以在异常准备切换线程时打包堆栈跟踪,但这看起来很糟糕)?

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

通常的方法是抛出一个新的异常,原始包含在InnerException Exception一个特殊的构造函数

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM