.Net 6.0全局异常捕获
背景:
全局异常捕获是我们开发当中不可获取的一个环节,顾名思义就是全局的捕获异常,并响应出去,今天就带着各位童鞋们在.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全局异常捕获的更多相关文章
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- Asp.Net MVC3(三)-MvcApp实现全局异常捕获
定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...
- .Net下的全局异常捕获问题
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
- (转)C#中的那些全局异常捕获
C#中的那些全局异常捕获(原文链接:http://www.cnblogs.com/taomylife/p/4528179.html) 1.WPF全局捕获异常 public partia ...
- springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)
在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...
- spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获
spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...
- Android全局异常捕获
PS:本文摘抄自<Android高级进阶>,仅供学习使用 Java API提供了一个全局异常捕获处理器,Android引用在Java层捕获Crash依赖的就是Thread.Uncaught ...
- .NET Core整合log4net以及全局异常捕获实现
在使用log4net之前先安装log4net.这里操作很简单,通过nuget下载并安装log4net很方便.如下图. log4net配置 <?xml version="1.0" ...
- springboot 全局异常捕获,异常流处理业务逻辑
前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...
- 【快学springboot】5.全局异常捕获,异常流处理业务逻辑
前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...
随机推荐
- Appium自动化测试之键盘操作pressKeyCode()方法(Android特有)
电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 KEYCODE_BACK ...
- STM32 GPIO配置(寄存器)生成工具
在写程序的时候需要用寄存器配置GPIO方向.模式,每一个都需要去计算 感觉相当麻烦,所以写了一个用来计算的小工具 链接:https://pan.baidu.com/s/1PEn0Q0IiA5mJJbs ...
- 本地jar包怎么导入到maven仓库中?
1.找到你所需要的jar包 2.打开cmd找到jar包的文件夹下 3.输入安装命令实例命令 1 安装指定文件到本地仓库命令:mvn install:install-file 2 -DgroupId=& ...
- SQL-分组聚合-子查询
-- having前面必须有group byselect e.deptno ,sum(e.sal) as sum_sal ,min(e.sal) as min_sal ,max(e.sal) as m ...
- bzoj 3924
动态点分治好题 首先我们考虑一个暴力做法: 每次修改之后选一个点作为根搜索整棵树,然后换根dp即可 考虑每次换根时,移向的点的消耗会减少子树代价之和*边权,而其余部分代价会增加剩余代价*边权 这样每次 ...
- css/js使用小技巧记录
1.白底小图标换色 .iconBox { position: relative; width: 19px; height: 19px; overflow: hidden; // 隐藏原本颜色的图片 . ...
- 使用bat脚本判断远程SVN文件是否有修改
在Windows上, 使用 svn status -u -q %dir% 可以列出svn仓库的状态: M 8295 build.bat * 8306 E:\game\bzk\dev\tools\pro ...
- Django框架搭建web项目(四)
启动项目前先创建后台admin账户 项目根目录下运行:python manage.py createsuperuser 设置admin账号成功后,在根目录下运行:manage.py文件,注意设置. 3 ...
- 【Delphi11】「Embarcadero.Delphi.11.0.v28.0.42600.6491.Lite.v17.0分享」
[Delphi11]转存或下载后将后缀名".exe"删除即可,或者直接右击解压缩也可.「Embarcadero.Delphi.11.0.v28.0.42600.6491.Lite. ...
- Centos7部署PXE+Kickstart 实现批量安装操作系统
1.PXE环境概述 作为一名运维人员,在一些中小公司经常会遇到一些机械式的重复工作,比如:批量一次大批量的进行操作系统的安装等等.为了实现自动化运维,减少人员负担我们可以部署以下服务:Kickstar ...