Visual Studio 2010中的Parallel.Invoke中的不可捕捉的异常
我在捕获在同一任务之外的Parallel.Invoke
任务中抛出的异常时遇到了问题。Visual Studio 2010中的Parallel.Invoke中的不可捕捉的异常
在某些PC上,这样的例外总会导致程序进入调试器,即使所有内容都在try catch
块中。
在其他PC上,这样的异常将被包装在AggregateException中,该异常可以在主线程中捕获。
下面的程序运行在一台PC上的精细,印刷"I don't care"
& "whatever"
static void Main(string[] args)
{
try
{
throw new Exception("1");
}
catch (Exception ex)
{
Console.WriteLine("I don't care");
}
try
{
System.Threading.Tasks.Parallel.Invoke(
new Action[]{
()=>{throw new Exception("2");},
});
}
catch (Exception ex)
{
Console.WriteLine("whatever");
}
}
但另一台PC上时,Visual Studio始终停止在第二个例外的程序(第一异常会导致没有问题)
我的期望是,Parallel.Invoke吞下Exception("2")
并生成一个新的主线程上的,可以被捕获。
这似乎适用于一台PC,但不适用于另一台PC。
当我没有调试器运行程序时,一切运行良好。
是否有特定的Visual Studio设置可能导致此?
我检查是否有点击Debugging/Exceptions/reset everything
任何奇怪的设置,但没有改进:
可谁都重现此问题?
我发现这个怪异行为的原因:
当设置just my code
是启用,Visual Studio将总是打破的Parallel.Invoke内异常的,即使最终AggregateExpection正陷入用户代码
当该设置为禁用,Visual Studio将内部没有Parallel.Invoke异常的突破。只有在未捕获到该异常的情况下,它才会中断所产生的AggregateException。
为了防止视觉工作室从打破捕捉到的异常,同时保持设置just my code
启用,你必须打开Debugging/Exceptions
和
"Common language Runtime Exceptions/User-unhandled"
小心删除复选标记:此不是默认设置,当您点击reset all
时,此设置将恢复。
与删除此复选标记后听起来相反,Visual Studio仍会在未处理的异常(即不在任何try-catch块内的异常)上中断。
例外设置,打破所有抛出的异常也许吧? – leppie
我试着在调试/例外情况下重置所有东西(我已经更新了我的问题以添加此内容)。我看不出有什么区别。我抛出的两个异常都是相同的基本类型:'new Exception()',但是'Parallel.Invoke'中只有一个不能被捕获。 – HugoRune