如何捕获任务中的异常?

How to catch an exception in a task?

在下面的示例中,异常没有被拦截,程序保持 运行 就好像什么都没发生一样。是否有全局错误处理程序可以拦截此类异常? 这里是游乐场 link.

配置

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

代码

using System;
using System.Threading.Tasks;

class Program
  {
    static public void Main(string[] args)
    {
      try
      {
        Program.ThrowErrorInTask();
        Task.Delay(2000).Wait();
        Console.WriteLine("Exception not caught");
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex);
      }
    }
    static public void ThrowErrorInTask()
    {
      Task.Run(() =>
      {
        throw new Exception("Something happened");
      });
    }
  }

由于您的 Task.Run 未被 await 编辑,因此它被视为即刻完成的任务。 Task 本身不能抛出异常(它只填充其 Exception 属性),await.GetAwaiter().GetResult() 可以。

TaskScheduler 公开了一个名为 UnobservedTaskException 的事件,只要您的 Task 被 GC 收集并且失败,就会引发该事件。 UnobservedTaskExceptionEventArgs 公开了一个 Exception 属性,其中包含未观察到的异常。

有关更多详细信息,请查看此 SO 线程:TaskScheduler.UnobservedTaskException event handler never being triggered