首页 > 解决方案 > 线程(任务)中的异常不会像示例所暗示的那样传播

问题描述

“C# 7.0 in a nutshell”中的示例代码,第 580 页:

        Task task = Task.Run(() => { throw null; });
        try
        { 
            task.Wait(); 
        }
        catch (Exception ex)
        { }

在我的 VS2017 中执行,并没有按照书中描述的方式工作。从 IDE 内部运行,System.NullReferenceException在第一行立即抛出(并停止执行),而该示例表明异常在启动的线程内抛出并在那里等待,直到有人调用或Wait()读取对象。在 p.277上简要解释了该类,并且非常不清楚地提到了可以使用的线程池。我猜在我的情况下它没有被使用,而是主线程正在执行 lambda,因此会生成一个未捕获的异常。我找不到有关如何或在何处配置线程池或ResultTaskTaskTask班级。还是我错过了一些完全不同的东西?

标签: c#task-parallel-librarythreadpool

解决方案


您很可能在抛出异常时看到调试器中断:

调试器在抛出时损坏

这里的赠品是对话框显示“抛出异常”,并且该throw语句以黄色突出显示。

默认情况下,当您的代码中的任何异常被抛出时,调试器将中断,无论它后来是否被捕获(或者,如果您禁用了“仅我的代码”,则在任何地方抛出任何异常时)。

您可以通过单击对话框中的“打开异常设置”链接或转到“调试”->“Windows”->“异常设置”并取消选中“通用语言运行时异常”来更改此设置。

异常设置

您还可以准确控制调试器将中断哪些异常。在“抛出异常”对话框中,您还可以取消选中“抛出此异常类型时中断”复选框,以停止调试器将来在该异常类型上中断。

当您意识到要重新启用默认异常集的中断时,异常设置顶部有一个方便的重置按钮:

异常设置重置


推荐阅读