如何捕获任务中的异常?
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。
在下面的示例中,异常没有被拦截,程序保持 运行 就好像什么都没发生一样。是否有全局错误处理程序可以拦截此类异常? 这里是游乐场 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。