当前位置: 首页 > 编程语言 > C#

在非UI线程上抛出exception时,如何保留堆栈跟踪分享

时间:2023-04-10 20:50:24 C#

C#学习教程:在非UI线程上抛出异常时如何保留堆栈跟踪/*...一些可以抛出异常的代码...*/}catch(Exceptione){throwe;//...使用“抛出;”本身而不是}但是,如果异常在非UI线程中被捕获,我想将它重新提升回UI并处理它,以便用户收到这样的消息:try{/*...some可以抛出异常的代码...*/}catch(Exceptione){Dispatcher.Invoke((Action)(()=>{throw;}));但是,我不能在这里单独使用throw关键字,因为C#词法分析器(正确地)认为throw语句不在catch中。我必须这样做:尝试{/*...一些可以抛出异常的代码...*/}catch(Exceptione){Dispatcher.Invoke((Action)(()=>{throwe;}));}并重新抛出异常,它失去了它的堆栈跟踪。有什么(简单的)方法可以解决这个问题(当异常准备好切换线程时,我总是可以打包堆栈跟踪,但这看起来很糟糕)?注意:我看到了这篇文章,但它只是在标题上相似,而不是内容。通常的做法是抛出一个新的异常,最初包裹在InnerException中。异常有一个特殊的构造函数。但是,如果您真的想这样做并且您使用的是.Net4.5,则可以使用ExceptionDispatchInfo来捕获ExceptionDispatchInfo的堆栈跟踪,然后在不重置堆栈跟踪的情况下将其重新扔到其他地方。但在大多数情况下,使用旧方法并将异常包装在新方法中可能会更好。以上就是C#学习教程:非UI线程抛出异常时如何保持stacktrace共享的所有内容,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: