Visual Studio 2010 年 Parallel.Invoke 中无法捕获的异常
Uncatchable Exception in Parallel.Invoke in 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")
并在主线程上生成一个新的 AggregateException
,可以被捕获。
这似乎适用于一台 PC,但不适用于另一台 PC。
当我 运行 没有调试器的程序时,一切 运行 都很好。
是否有可能导致此问题的特定 Visual Studio 设置?
我通过点击Debugging/Exceptions/reset everything
检查了是否有任何奇怪的设置,但没有改进:
其他人能重现这个问题吗?
我找到了这种奇怪行为的原因:
当设置just my code
启用时,visual studio将总是中断在Parallel.Invoke,即使生成的 AggregateExpection 被用户代码捕获
当该设置被 禁用 时,visual studio 将 不会中断 Parallel.Invoke 内的异常。仅当未捕获该异常时,它才会在生成的 AggregateException 上中断。
为了防止 visual studio 中断捕捉到的异常,同时保持设置 just my code
启用,您必须打开 Debugging / Exceptions
和从
中删除复选标记
"Common language Runtime Exceptions / User-unhandled"
注意:这不是默认设置,当您单击 reset all
时,此设置将恢复。
与听起来可能相反,删除此复选标记后,visual studio 仍会在未处理的异常(即不在任何 try-catch 块内的异常)上中断。
我无法从同一任务外部捕获 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")
并在主线程上生成一个新的 AggregateException
,可以被捕获。
这似乎适用于一台 PC,但不适用于另一台 PC。
当我 运行 没有调试器的程序时,一切 运行 都很好。
是否有可能导致此问题的特定 Visual Studio 设置?
我通过点击Debugging/Exceptions/reset everything
检查了是否有任何奇怪的设置,但没有改进:
其他人能重现这个问题吗?
我找到了这种奇怪行为的原因:
当设置just my code
启用时,visual studio将总是中断在Parallel.Invoke,即使生成的 AggregateExpection 被用户代码捕获
当该设置被 禁用 时,visual studio 将 不会中断 Parallel.Invoke 内的异常。仅当未捕获该异常时,它才会在生成的 AggregateException 上中断。
为了防止 visual studio 中断捕捉到的异常,同时保持设置 just my code
启用,您必须打开 Debugging / Exceptions
和从
"Common language Runtime Exceptions / User-unhandled"
注意:这不是默认设置,当您单击 reset all
时,此设置将恢复。
与听起来可能相反,删除此复选标记后,visual studio 仍会在未处理的异常(即不在任何 try-catch 块内的异常)上中断。