繁体   English   中英

如何捕获任务中的异常?

[英]How to catch an exception in a task?

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

配置

<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 ed,因此它被认为是一项即发即忘的任务。 Task本身不能抛出异常(它只填充它的Exception属性), await.GetAwaiter().GetResult()可以。

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

有关更多详细信息,请查看此 SO 线程: TaskScheduler.UnobservedTaskException 事件处理程序永远不会被触发

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM