[英]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.