背景:

全局异常捕获是我们开发当中不可获取的一个环节,顾名思义就是全局的捕获异常,并响应出去,今天就带着各位童鞋们在.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>();

效果:

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

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

.Net 6.0全局异常捕获的更多相关文章

  1. C#中的那些全局异常捕获

    1.WPF全局捕获异常     public partial class App : Application     {         public App()         {    // 在异 ...

  2. Asp.Net MVC3(三)-MvcApp实现全局异常捕获

    定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...

  3. .Net下的全局异常捕获问题

    全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...

  4. (转)C#中的那些全局异常捕获

    C#中的那些全局异常捕获(原文链接:http://www.cnblogs.com/taomylife/p/4528179.html)   1.WPF全局捕获异常       public partia ...

  5. springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)

    在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...

  6. spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获

    spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...

  7. Android全局异常捕获

    PS:本文摘抄自<Android高级进阶>,仅供学习使用 Java API提供了一个全局异常捕获处理器,Android引用在Java层捕获Crash依赖的就是Thread.Uncaught ...

  8. .NET Core整合log4net以及全局异常捕获实现

    在使用log4net之前先安装log4net.这里操作很简单,通过nuget下载并安装log4net很方便.如下图. log4net配置 <?xml version="1.0" ...

  9. springboot 全局异常捕获,异常流处理业务逻辑

    前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...

  10. 【快学springboot】5.全局异常捕获,异常流处理业务逻辑

    前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...

随机推荐

  1. Linux C语言编程基础

    Linux C语言编程基础 选择教材第二章的一节进行编程基础练习 二叉树广度优先遍历(链队) 算法: "head.h" #ifndef _head_h_ #define _head ...

  2. Python-pytest -> Selenium之异常处理

    Selenium之异常处理: 引用的库:(可以查看库里提供的异常类) from selenium.common.exceptions import ElementNotVisibleException ...

  3. SQL查询 错误 [1843] [22008]: ORA-01843: 无效的月份

    dbeaver客户端运行sql查询Oracle库报错. 正确示例: select count(*) from PRODUCTS WHERE CREATE_TIME > '15-7月-2021 ' ...

  4. cp 备份文件命令

    cp -p system.sh ./bak2022/systecm.sh.bak_`date '+%Y%m%d'` (备份system.sh文件后缀以bak_年月日命令)cp -rf old copy ...

  5. 在CentOS下安装nginx+php环境

    一.nginx 安装 1. 在nginx官网下载nginx源码 提供一个nginx官网下载地址: http://nginx.org/download/nginx-1.12.2.tar.gz 注意:请先 ...

  6. Python turtle print TaiChi

    import turtle turtle.pensize(20) turtle.pencolor("black") turtle.penup() turtle.goto(0,300 ...

  7. docker知识篇

    什么是Docker?Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).b ...

  8. goland 快捷键

    goland常用快捷键 Coldestmonth 2018-07-17 17:26:37 18067 收藏 14版权Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/-/ )Ctrl+D ...

  9. Linux CentOS Docker 安装、加载配置

    Docker Version:2.10.2 OS: CentOS 7 1.卸载 $ sudo yum remove docker \ docker-client \ docker-client-lat ...

  10. 发布订阅清理distribution未执行导致distribution库特别大处理办法

    近期发现数据服务器中数据库所在盘被占用的特别严重,一个800G的盘只剩下不到100G,排除备份所占用的其他的空间竟然有400G被安装目录下的分发数据库distribution.MDF所占用. 分发数据 ...