线程(任务)中的异常不会像示例所示那样传播

时间:2019-06-05 12:17:27

标签: c# task-parallel-library threadpool

“简而言之C#7.0”中的示例代码,第580页:

        Task task = Task.Run(() => { throw null; });
        try
        { 
            task.Wait(); 
        }
        catch (Exception ex)
        { }
在我的VS2017中执行的

与书中所述的方式不同。 从System.NullReferenceException在IDE内部运行,第一行立即抛出Wait(),而该示例建议在启动的线程中抛出该异常,并等待在那里,直到有人调用Result或在Task对象上读取Task。在第277页中,对Task类进行了简要说明,并且对线程池可以使用 的提及非常不清楚。我想在我的情况下不使用它,而是主线程正在执行lambda,因此生成未捕获的异常。我找不到关于如何或在何处配置线程池或def sim_time(self, record, datefmt=None): return datetime.datetime(2000,1,2,3,4,5,678).strftime('%Y-%m-%d %H:%M:%S,%f')[:-3] import logging logging.Formatter.formatTime = sim_time 类的行为的提示。还是我错过了完全不同的东西?

1 个答案:

答案 0 :(得分:3)

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

Debugger broken on thrown

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

默认情况下,调试器将在引发代码内的任何异常时中断,无论以后是否捕获到该异常(或者,如果禁用了“我的代码”,则在任何地方引发任何异常)。

您可以通过单击对话框中的“打开例外设置”链接或转到“调试”->“ Windows”->“例外设置”,然后取消选中“公共语言运行时例外”来更改此设置。

Exception Settings

您还可以精确控制调试器将中断哪些异常。在“引发异常”对话框中,您也可以取消选中“引发此异常类型时中断”复选框,以防止调试器将来破坏该异常类型。

当您意识到要重新启用默认的一组异常时,“异常设置”顶部将提供一个方便的重置按钮:

Exception Settings Reset