Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在非UI线程上引发异常时,如何保留堆栈跟踪_C#_Wpf_Exception - Fatal编程技术网

C# 在非UI线程上引发异常时,如何保留堆栈跟踪

C# 在非UI线程上引发异常时,如何保留堆栈跟踪,c#,wpf,exception,C#,Wpf,Exception,这样做是不好的,因为它不保留堆栈跟踪: 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 exceptio

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

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
<代码>异常已发生


但是,如果您真的想这样做,并且您在.NET4.5上,可以捕获异常的堆栈跟踪,然后在其他地方重新引用它,而不重置堆栈跟踪。但是在大多数情况下,使用旧的方法将异常包装到新的异常中可能更好。

您是否尝试过使用
异常、字符串、异常
构造函数抛出新的
异常
?这样,你的内部异常将是原始异常。任何关于你为什么要首先尝试/捕获它的原因,当你所做的只是重新抛出它时。此外,如果您将这些PDB文件放入EXE/DLLs.duplicate,堆栈跟踪将失效?在另一个注释中,我建议退出catch块,然后调用。例如,如果在所调用的操作中抛出新异常,您将获得更容易理解的流路径。