首页 > 其他分享 >.Net 6.0全局异常捕获

.Net 6.0全局异常捕获

时间:2023-03-27 11:48:50浏览次数:50  
标签:捕获 中间件 ex 6.0 Net 异常 全局 errorResponse

背景:

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

思路:

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

实现:

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

 

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

 

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

复制代码
 1   /// <summary>
 2     /// 全局异常捕获中间件
 3     /// </summary>
 4     public class ExceptionHandlingMiddleware
 5     {
 6         private readonly RequestDelegate _next;  // 用来处理上下文请求  
 7         private readonly ILogger<ExceptionHandlingMiddleware> _logger;
 8 
 9         public ExceptionHandlingMiddleware(RequestDelegate next, ILogger<ExceptionHandlingMiddleware> logger)
10         {
11             _next = next;
12             _logger = logger;
13         }
14 
15         /// <summary>
16         /// 执行中间件
17         /// </summary>
18         /// <param name="httpContext"></param>
19         /// <returns></returns>
20         public async Task InvokeAsync(HttpContext httpContext)
21         {
22             try
23             {
24                 await _next(httpContext); //要么在中间件中处理,要么被传递到下一个中间件中去
25             }
26             catch (Exception ex)
27             {
28                 await HandleExceptionAsync(httpContext, ex); // 捕获异常了 在HandleExceptionAsync中处理
29             }
30         }
31 
32         /// <summary>
33         /// 异步处理异常
34         /// </summary>
35         /// <param name="context"></param>
36         /// <param name="exception"></param>
37         /// <returns></returns>
38         private async Task HandleExceptionAsync(HttpContext context, Exception exception)
39         {
40             context.Response.ContentType = "application/json";  // 返回json 类型
41             var response = context.Response;
42             var errorResponse = new ActionTResult
43             {
44                 Succes = SuccessTypeEnum.Error
45             };  // 自定义的异常错误信息类型
46             switch (exception)
47             {
48                 case ApplicationException ex:
49                     if (ex.Message.Contains("Invalid token"))
50                     {
51                         response.StatusCode = (int)HttpStatusCode.Forbidden;
52                         errorResponse.ErrorMsg = ex.Message;
53                         break;
54                     }
55                     response.StatusCode = (int)HttpStatusCode.BadRequest;
56                     errorResponse.ErrorMsg = ex.Message;
57                     break;
58                 case KeyNotFoundException ex:
59                     response.StatusCode = (int)HttpStatusCode.NotFound;
60                     errorResponse.ErrorMsg = ex.Message;
61                     break;
62                 default:
63                     response.StatusCode = (int)HttpStatusCode.InternalServerError;
64                     errorResponse.ErrorMsg = "Internal Server errors. Check Logs!";
65                     break;
66             }
67             _logger.LogError(exception.Message);
68             var result = JsonSerializer.Serialize(errorResponse);
69             await context.Response.WriteAsync(result);
70         }
71     }
复制代码

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

1 app.UseMiddleware<ExceptionHandlingMiddleware>();

效果:

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

 

 

 

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

本文来自博客园,作者:沈威,转载请注明原文链接:https://www.cnblogs.com/shenweif/p/17236321.html

标签:捕获,中间件,ex,6.0,Net,异常,全局,errorResponse
From: https://www.cnblogs.com/wl-blog/p/17261019.html

相关文章

  • .Net 6.0中使用JWT加密
    准备工作:在步入正题之前我们首先要对JWT加密有个初步的概念和认识,并对其原理有一定的理解,这样才能使我们在.Net6.0中更快的上手JWT加密,下面是我整理JWT加密的一些资......
  • gRPC之.Net6中的初步使用介绍
    1、......
  • Understanding plasticity in neural networks
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Arxiv 2023 Abstract可塑性是神经网络根据新信息快速改变预测的能力,对于深度强化学习系统的适应性和鲁......
  • ASP.NET Core - 选项系统之选项配置
    1.选项前面讲完了.NETCore下的配置系统,我们可以通过IConfiguration服务从各种来源的配置中读取到配置信息,但是每次要用的时候都通过Iconfiguration读取配置文件会......
  • .Net 6.0定义全局当前身份缓存对象
    背景:当前身份缓存对象顾名思义就是:当前登录的用户身份对象,那它解决了什么问题呢?其实在我们日常开发过程中经常能用的到几乎是必备的,就比如我给某个表插入数据时......
  • 【转】NETCore下IConfiguration和IOptions的用法
    新建一个NETCoreWebAPI项目,在Startup.cs里就会开始使用IConfiguration和IOptions了,我们来看看如何使用。IConfiguration是用来加载配置值的,可以加载内存键值对、JSON或X......
  • ASP.NET Core - 配置系统之配置读取
    一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们......
  • 记一次 .NET 某企业 ERP网站系统 崩溃分析
    一:背景1.讲故事前段时间收到了一个朋友的求助,说他的ERP网站系统会出现偶发性崩溃,找了好久也没找到是什么原因,让我帮忙看下,其实崩溃好说,用procdump自动抓一个就好,拿到......
  • neural-network-3b1b-watching-notes
    3B1B观看笔记Datetime:2023-03-26T23:20+08:00Categories:MachineLearningNeuralNetworksPlaylistonYoutubewhatismlp?costfunctionandparamsgradient......
  • Spatio-Temporal Representation With Deep Neural Recurrent Network in MIMO CSI Fe
    阅读文献《Spatio-TemporalRepresentationWithDeepNeuralRecurrentNetworkinMIMOCSIFeedback》​ 该文献的作者是天津大学的吴华明老师,在2020年5月发表于IEEE......