.Net 6.0全局异常捕获

Posted 沈威的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net 6.0全局异常捕获相关的知识,希望对你有一定的参考价值。

背景:

全局异常捕获是我们开发当中不可获取的一个环节,顾名思义就是全局的捕获异常,并响应出去,今天就带着各位童鞋们在.Net 6.0当中如何做到全局异常捕获.

思路:

我们可以通过请求管道达到我们全局的一个场景,所以我们第一步就是在请求管道中自定义一个全局异常捕获的中间件,并通过try catch来实现,是不是特别简单,好话不多说下面就带着各位步入正题!!!

实现:

1.在根目录中创建Middlewares文件夹,并创建ExceptionHandlingMiddleware类(自定义中间件)

 

 2.创建一个捕获异常后需要将错误信息响应出去的容器,哈哈哈大白话来说就是一个类,我这就暂命名为ActionTResult

 

 3.实现ExceptionHandlingMiddleware中代码逻辑,不卖关子,直接上代码!!!

   /// <summary>
     /// 全局异常捕获中间件
     /// </summary>
     public class ExceptionHandlingMiddleware
     
         private readonly RequestDelegate _next;  // 用来处理上下文请求  
         private readonly ILogger<ExceptionHandlingMiddleware> _logger;
 
         public ExceptionHandlingMiddleware(RequestDelegate next, ILogger<ExceptionHandlingMiddleware> logger)
         
             _next = next;
             _logger = logger;
         
 
         /// <summary>
         /// 执行中间件
         /// </summary>
         /// <param name="httpContext"></param>
         /// <returns></returns>
         public async Task InvokeAsync(HttpContext httpContext)
         
             try
             
                 await _next(httpContext); //要么在中间件中处理,要么被传递到下一个中间件中去
             
             catch (Exception ex)
             
                 await HandleExceptionAsync(httpContext, ex); // 捕获异常了 在HandleExceptionAsync中处理
             
         
 
         /// <summary>
         /// 异步处理异常
         /// </summary>
         /// <param name="context"></param>
         /// <param name="exception"></param>
         /// <returns></returns>
         private async Task HandleExceptionAsync(HttpContext context, Exception exception)
         
             context.Response.ContentType = "application/json";  // 返回json 类型
             var response = context.Response;
             var errorResponse = new ActionTResult
             
                 Succes = SuccessTypeEnum.Error
             ;  // 自定义的异常错误信息类型
             switch (exception)
             
                 case ApplicationException ex:
                     if (ex.Message.Contains("Invalid token"))
                     
                         response.StatusCode = (int)HttpStatusCode.Forbidden;
                         errorResponse.ErrorMsg = ex.Message;
                         break;
                     
                     response.StatusCode = (int)HttpStatusCode.BadRequest;
                     errorResponse.ErrorMsg = ex.Message;
                     break;
                 case KeyNotFoundException ex:
                     response.StatusCode = (int)HttpStatusCode.NotFound;
                     errorResponse.ErrorMsg = ex.Message;
                     break;
                 default:
                     response.StatusCode = (int)HttpStatusCode.InternalServerError;
                     errorResponse.ErrorMsg = "Internal Server errors. Check Logs!";
                     break;
             
             _logger.LogError(exception.Message);
             var result = JsonSerializer.Serialize(errorResponse);
             await context.Response.WriteAsync(result);
         
     

4.在请求管道中直接使用即可

 app.UseMiddleware<ExceptionHandlingMiddleware>();

效果:

  到这里其实我们已经实现了一个全局异常捕获了,我们一起来看看效果吧!

 

 

 

 在这里本章节就结束了,希望对在坐的各位童鞋有所帮助,当然如果有发现不足或者不对的地方也欢迎探讨,及时指正!!!

以上是关于.Net 6.0全局异常捕获的主要内容,如果未能解决你的问题,请参考以下文章

自定义全局异常捕获

WPF全局异常捕获

Android应用捕获全局异常自定义处理

Spring 框架——利用HandlerExceptionResolver实现全局异常捕获

ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常

Android 捕获全局异常CrashHandler,防止异常闪退,记录异常日志