c# - UseExceptionHandler 不会捕获任务异常?

标签 c# asp.net-core .net-core

我创建了一个简单的 webapi .net core 3.1 应用。

我想捕获所有未处理的异常。所以我根据 docs 放置这段代码:

app.UseExceptionHandler(c => c.Run(async context =>
{
    var exception = context.Features
        .Get<IExceptionHandlerPathFeature>()
        .Error;
    var response = new { error = exception.Message };
    log.LogDebug(exception.Message);
}));

这是我的 Action :

[HttpGet]
public IActionResult Get()
{
    throw new Exception("this is a test");
}

当这段代码运行时,我确实看到 UseExceptionHandler 正在工作。

但是当我在操作中的代码是:

[HttpGet]
public IActionResult Get()
{
    Task.Run(async () =>
    {
        await Task.Delay(4000);
        throw new Exception("this is a test");
    });
       
    return Ok();
}

然后 UseExceptionHandler NOT 工作。

但是 - 以下代码确实捕获了任务的异常:

 AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
 {
     Debug.WriteLine(eventArgs.Exception.ToString());
 };  

问题:

  • 为什么 UseExceptionHandler 无法识别任务异常?
  • 如何捕获所有类型的异常?我应该只依赖 AppDomain.CurrentDomain.FirstChanceException 吗?

nb,我确实禁用了 app.UseDeveloperExceptionPage();

最佳答案

回答您的问题。

为什么 UseExceptionHandler 无法识别任务异常?

正如评论中已经建议的那样,您不能使用 UseExceptionHandler 来捕获在非等待任务中启动的异常。 UseExceptionHandler 将您的请求包装在 ASP.NET Core 中间件中。一旦操作向客户端返回 OK,中间件就不再能够捕获从操作中启动的任务中发生的任何异常。

如何捕获所有类型的异常?我应该只依赖 AppDomain.CurrentDomain.FirstChanceException 吗?

如果您愿意,您可以全局捕获异常并以这种方式记录它们。但我不建议你这样做。您需要实现此事件的唯一原因是您在 Web 请求中启动任务/线程。您无法知道这些任务是否一直在运行(应用程序重启、回收等)。如果您希望使用 ASP.NET Core 启动后台任务,您应该使用 Worker Services,这是执行此操作的预期方式:

.ConfigureServices((hostContext, services) =>
{
    services.AddHostedService<MyWorker>();
});
public class MyWorker : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                // Do work
            }
            catch (Exception e)
            {
                // Log it?
            }

            await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
        }
    }
}

关于c# - UseExceptionHandler 不会捕获任务异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68242757/

相关文章:

c# datetimepicker : how do i get the date in the format? 2001/1/1

c# - 如何将英文字符串日期转换为葡萄牙语字符串日期

c# - 如何在 ASP.NET Core 中处理多值 cookie?

c# - 在 ASP .NET Core 中自动递增版本号

c# - 我需要一个正则表达式来检测 MailChimp 标签

c# - 服务器端的 Blazor : using MongoDB for Identity management

mono - Linux Ubuntu 14.04 上的 ASP.NET vNext。无法加载 Kestrel

.net-core - .Net Core 3 预览 SequenceReader 长度分隔解析

c# - ASP.NET核心: Parse complex struct from URL

c# - Swashbuckle .NET Core 2 中 JWT 承载的授权