这样做是不好的形式,因为它不保留堆栈跟踪:
try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
throw e; // ...Use "throw;" by itself instead
}
Run Code Online (Sandbox Code Playgroud)
但是,如果在非UI线程上捕获到异常,我想将其重新提升回UI并处理它,以便用户获取如下消息:
try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
Dispatcher.Invoke((Action)(() => { throw; }));
}
Run Code Online (Sandbox Code Playgroud)
但是,我不能在这里单独使用throw关键字,因为C#lexer(正确)认为throw语句不在catch中.我不得不这样做:
try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
Dispatcher.Invoke((Action)(() => { throw e; }));
}
Run Code Online (Sandbox Code Playgroud)
并重新抛出异常,这会丢失其堆栈跟踪.
是否有任何(简单)方法来解决这个问题(我总是可以在异常准备切换线程时打包堆栈跟踪,但这看起来很糟糕)?
注意:我看到了这个帖子,但它的标题只相似,而不是内容.
通常的方法是抛出一个新的异常,并将原始异常包含为InnerException
. 为此Exception
有一个特殊的构造函数。
但是,如果您确实想这样做并且使用的是 .Net 4.5,则可以使用ExceptionDispatchInfo
捕获异常的堆栈跟踪,然后将其重新抛出到其他地方,而无需重置堆栈跟踪。但在大多数情况下,使用旧方法将异常包装在新方法中可能会更好。
归档时间: |
|
查看次数: |
4979 次 |
最近记录: |