首页 > 解决方案 > 如何捕获线程中发生的 Asp.net 核心中的异常

问题描述

有一些任务我附加了一个动作。我有一个用于观察所有异常的中间件。现在,线程异常存在问题。我已经在动作主体中手动抛出异常,但是当我抛出异常时,应用程序进入中断模式状态,我无法监视异常。

在配置mvc之前,我把我的错误处理中间件

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context /* other dependencies */)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        var code = HttpStatusCode.InternalServerError; 

        var result = JsonConvert.SerializeObject(new { error = exception.Message });
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;
        return context.Response.WriteAsync(result);
    }
}
//and this is the piece of code that run all tasks. 
foreach (var item in BotList)
{
            BotHandler BotObject = new BotHandler(item,conn);
            Task.Run(() => { BotObject.Run();});
}      
//

  public void Run()
    {

        //BotClient.StopReceiving();
        BotClient.OnMessage += BotOnMessageReceived;
        BotClient.OnMessageEdited += BotOnMessageReceived;
        BotClient.OnCallbackQuery += BotOnCallbackQueryReceived;

    }
     private async void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs)
    {
       try
           {
              //do something
                string a = null;
                var b = a.ToString();
           }
       catch(Exception exp )
       {
         throw exp
       }
    }
}

标签: c#asp.net-coretask

解决方案


如果你去这里https://msdn.microsoft.com/en-us/magazine/jj991977.aspx你会读到的。

Catch 无法捕获来自异步 Void 方法的异常

因此,您无法捕获您在 BotOnMessageReceived 方法(在 Catch 部分)中抛出的异常(中间件不能)。

所以你有2个解决方案。

  1. 删除 async 关键字
  2. 或者如果可能的话,捕获应用程序未处理的异常。例如,在普通的 .net 框架控制台应用程序中,您在应用程序中有称为未处理异常的事件,并且可以处理像您这样的情况。

我也在这里找到了 smth,也许它会有所帮助 How do I catch unhandled exceptions in ASP .NET Core 2.0 before the page is rendering?


推荐阅读