线程(任务)中的异常不会像示例建议的那样传播
Exception in thread (Task) is not propagated like example suggests
示例代码来自 "C# 7.0 in a nutshell",第 580 页:
Task task = Task.Run(() => { throw null; });
try
{
task.Wait();
}
catch (Exception ex)
{ }
在我的 VS2017 中执行,与书中描述的方式不符。
运行 从 IDE 内部,System.NullReferenceException
在第一行立即抛出(并停止执行),而该示例表明异常在启动线程内抛出并在那里等待直到有人在 Task
对象上调用 Wait()
或读取 Result
。在第 277 页上,Task
class 被简要解释,并且对 线程池 的提及非常不清楚,其中 可以 使用。我想在我的例子中它没有被使用,而是主线程正在执行 lambda,因此生成了一个未捕获的异常。我找不到有关如何或在何处配置线程池或 Task
class 行为的提示。还是我错过了完全不同的东西?
您可能看到调试器在 抛出异常:
时中断
这里的赠品是对话框显示 "Exception Thrown",并且 throw
语句以黄色突出显示。
默认情况下,当代码中的任何异常被抛出时,调试器将中断,而不管它后来是否被捕获(或者,如果您禁用了“仅我的代码”,当任何地方抛出任何异常时)。
您可以通过单击对话框中的 "Open Exception Settings" link 或转到调试 -> Windows -> 异常设置并取消选中 "Common Language Runtime Exceptions" 来更改此设置。
您还可以准确控制调试器将中断哪些异常。在 "Exception Thrown" 对话框中,您还可以取消勾选 "Break when this exception type is thrown" 复选框以阻止调试器在将来中断该异常类型。
当您意识到要 re-enable 打破默认的异常集时,异常设置顶部有一个方便的重置按钮:
示例代码来自 "C# 7.0 in a nutshell",第 580 页:
Task task = Task.Run(() => { throw null; });
try
{
task.Wait();
}
catch (Exception ex)
{ }
在我的 VS2017 中执行,与书中描述的方式不符。
运行 从 IDE 内部,System.NullReferenceException
在第一行立即抛出(并停止执行),而该示例表明异常在启动线程内抛出并在那里等待直到有人在 Task
对象上调用 Wait()
或读取 Result
。在第 277 页上,Task
class 被简要解释,并且对 线程池 的提及非常不清楚,其中 可以 使用。我想在我的例子中它没有被使用,而是主线程正在执行 lambda,因此生成了一个未捕获的异常。我找不到有关如何或在何处配置线程池或 Task
class 行为的提示。还是我错过了完全不同的东西?
您可能看到调试器在 抛出异常:
时中断这里的赠品是对话框显示 "Exception Thrown",并且 throw
语句以黄色突出显示。
默认情况下,当代码中的任何异常被抛出时,调试器将中断,而不管它后来是否被捕获(或者,如果您禁用了“仅我的代码”,当任何地方抛出任何异常时)。
您可以通过单击对话框中的 "Open Exception Settings" link 或转到调试 -> Windows -> 异常设置并取消选中 "Common Language Runtime Exceptions" 来更改此设置。
您还可以准确控制调试器将中断哪些异常。在 "Exception Thrown" 对话框中,您还可以取消勾选 "Break when this exception type is thrown" 复选框以阻止调试器在将来中断该异常类型。
当您意识到要 re-enable 打破默认的异常集时,异常设置顶部有一个方便的重置按钮: