.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": ...
随机推荐
- HFSS仿真疑问
P15针在0.5pitch下,GS结构相比GSG更接近50Ω,但是在某些频点会有明显的反射,该频点插损比较大. 从TDR上看,阻抗呈正弦形状变化,有些奇怪. 空气盒子只增加了2mm,试了一下将空气盒子 ...
- Centos使用nohup实现后台运行程序
nohup和&的区别& : 指在后台运行 nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断 ...
- 解决href 不下载直接跳转到新的页面
1.下载 不支持所有浏览器 2 var eleTextarea = document.querySelector('textarea'); var eleButton = document.query ...
- js判断变量数据类型typeof、instanceof、Object.prototype.toString.call()、 constructor
JavaScript有4种方法判断变量的类型,分别是typeof.instanceof.Object.prototype.toString.call()(对象原型链判断方法). constructor ...
- c++学习1 基础关键词
一 "const" 修饰变量 只能被初始化和读取,不能被赋值更改,且必需初始化,不初始化的话会因为读取到随机数而报错. example: const int date=100; c ...
- vue 项目打包 遇到问题 npm run build 无法打包
npm run build 打包 直接报错!!! 发现package.json中build的打包后边多了一个:prod 因此打包直接使用 npm run build:prod
- Debug --> python中的True False 0 1
今天看了下python中的一些基础知识,以offer64为例叭! 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B ...
- Topsis法的python实现
TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution )法是C.L.Hwang和K.Yoon于1981年首 ...
- copy file from remote server to local
scp -r root@IP:/path/to/file(file path on the server) /path/to/filedestination(local path)
- 2022竞赛新方法学习1--学习Proceedings of SAT Competition 2022 : Solver and Benchmark Descriptions
Proceedings of SAT Competition 2022 : Solver and Benchmark Descriptions https://helda.helsinki.fi/ha ...