这样做是不好的形式,因为它不能保留堆栈跟踪:
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; }));
}
并重新抛出异常,这将导致其堆栈跟踪丢失。
是否有任何(简单)方法可以解决这个问题(我始终可以在准备切换线程时打包堆栈跟踪,但这似乎很不可靠)?
注意:我看到了此主题,但它仅在标题上与此内容相似。
Exception, string, Exception
构造函数抛出新的Exception
吗?这样你的内部异常就会是原始异常。 - Daniel Kelley