【问题标题】:Uncatchable Exception in Parallel.Invoke in Visual Studio 2010Visual Studio 2010 中的 Parallel.Invoke 中无法捕获的异常
【发布时间】:2016-08-05 17:22:13
【问题描述】:

我无法从同一任务之外捕获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检查了是否有任何奇怪的设置,但没有改进:

其他人可以重现这个问题吗?

【问题讨论】:

  • 异常设置,可能会中断所有抛出的异常?
  • 我尝试在调试/异常下重置所有内容(我已更新我的问题以添加此内容)。我看不出有什么不同。而且我抛出的两个异常都是相同的基本类型:new Exception(),但有时无法捕获 Parallel.Invoke 内部的异常。

标签: c# visual-studio-2010 .net-4.0 task-parallel-library


【解决方案1】:

我找到了这种奇怪行为的原因:

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 块内的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多