说明

该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。

该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。

说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。

友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。

有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我

为什么要用全局异常捕获?

对于一个系统来说,全局异常捕获是必不可少的,它不仅可以把异常信息精简后反馈给用户,还能帮助程序员减少解决问题的时间,以及记录系统中任何一处发生异常的信息。

你是否依然有以下苦恼?

你是否还在为怎么记录系统异常日志而苦恼?

你是否还在为系统报错位置和报错信息苦恼?

你是否还在每个接口处增加日志记录操作?

如果你有,那么本篇文章正好可以解决你的难题。

什么是全局异常捕获机制?

全局异常捕获,顾名思义就是系统无论在那个位置发生错误都会被捕获,从而进行处理。

创建接口返回模型

创建一个接口返回模型:ReceiveStatus.cs

它的主要作用是把接口返回的数据、信息推送给前端。

 /// <summary>
/// 接口返回实体模型
/// </summary>
public class ReceiveStatus
{
/// <summary>
/// 编码
/// </summary>
public CodeStatuEnum code { get; set; } /// <summary>
/// 信息
/// </summary>
public string msg { get; set; } /// <summary>
/// 是否成功
/// </summary>
public bool success { get; set; } /// <summary>
/// 构造函数
/// </summary>
public ReceiveStatus()
{
code = CodeStatuEnum.Successful;
success = true;
msg = "操作成功";
}
}
/// <summary>
/// 接口返回结果集
/// </summary>
/// <typeparam name="T"></typeparam>
public class ReceiveStatus<T> : ReceiveStatus
{
/// <summary>
/// 数据
/// </summary>
public List<T> data { get; set; } /// <summary>
/// 总数量
/// </summary>
public int total { get; set; }
}
CodeStatuEnum.cs枚举值如下
 /// <summary>
/// 代码状态枚举
/// </summary>
public enum CodeStatuEnum
{
/// <summary>
/// 操作成功
/// </summary>
Successful = 200, /// <summary>
/// 警告
/// </summary>
Warning = 99991, /// <summary>
/// 操作引发错误
/// </summary>
Error = 99992
}

创建好接口返回模型后,我们创建一个异常帮助类,它的主要用途,是区分【系统异常】还是用户自定义的【业务异常】。

/// <summary>
/// 异常帮助类
/// </summary>
public class ExceptionHelper
{
/// <summary>
/// 自定义异常(会写入错误日志表)
/// </summary>
/// <param name="msg"></param>
public static void ThrowBusinessException(string msg)
{
throw new Exception(msg);
} /// <summary>
/// 自定义业务异常(不会写入错误日志表)
/// </summary>
/// <param name="msg">信息信息</param>
/// <param name="codeStatu">异常状态</param>
/// <returns>返回结果集</returns>
public static ReceiveStatus CustomException(string msg, CodeStatuEnum codeStatu = CodeStatuEnum.Warning)
{
ReceiveStatus receiveStatus = new();
receiveStatus.code = codeStatu;
receiveStatus.msg = msg;
receiveStatus.success = false;
return receiveStatus;
} } /// <summary>
/// 异常帮助类(返回数据)
/// </summary>
/// <typeparam name="T"></typeparam>
public class ExceptionHelper<T> : ExceptionHelper
{
/// <summary>
/// 自定义业务异常(不会写入错误日志表)
/// </summary>
/// <param name="msg">信息信息</param>
/// <param name="codeStatu">异常状态</param>
/// <returns>返回结果集</returns>
public static ReceiveStatus<T> CustomExceptionData(string msg, CodeStatuEnum codeStatu = CodeStatuEnum.Warning)
{
ReceiveStatus<T> receiveStatus = new();
receiveStatus.code = codeStatu;
receiveStatus.msg = msg;
receiveStatus.success = false;
receiveStatus.data = new System.Collections.Generic.List<T>();
return receiveStatus;
}
}

创建全局异常捕获中间件

在wenApi启动项目中创建一个类:ExceptionPlugIn.cs

它的主要作用就是捕获系统中发生异常对代码和记录异常日志。

它需要继承一个接口:IAsyncExceptionFilter

/// <summary>
/// 全局异常捕获中间件
/// </summary>
public class ExceptionPlugIn : IAsyncExceptionFilter
{
/// <summary>
/// 全局异常捕获接口
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public Task OnExceptionAsync(ExceptionContext context)
{
//异常信息
Exception ex = context.Exception; //异常位置
var DisplayName = context.ActionDescriptor.DisplayName; //异常行号
int lineNumber = 0;
const string lineSearch = ":line ";
var index = ex.StackTrace.LastIndexOf(lineSearch);
if (index != -1)
{
var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
lineNumber = Convert.ToInt32(lineNumberText.Substring(0, lineNumberText.IndexOf("\r\n")));
} // 如果异常没有被处理则进行处理
if (context.ExceptionHandled == false)
{
string exceptionMsg = "错误位置:" + DisplayName + "\r\n" + "错误行号:" + lineNumber + "\r\n" + "错误信息:" + ex.Message;
// 定义返回类型
var result = new ReceiveStatus<string>
{
code = CodeStatuEnum.Error,
msg = "错误信息:" + exceptionMsg,
success = false,
};
context.Result = new ContentResult
{
// 返回状态码设置为200,表示
StatusCode = StatusCodes.Status500InternalServerError,
// 设置返回格式
ContentType = "application/json;charset=utf-8",
Content = JsonConvert.SerializeObject(result)
};
//记录日志 }
// 设置为true,表示异常已经被处理了
context.ExceptionHandled = true;
return Task.CompletedTask;
}
}

可以在OnExceptionAsync方法中添加记录日志、异常类型、异常分析等代码。

添加到服务中

编写好异常捕获机制后,我们需要把该类添加到Program.cs的服务中

//自定义全局异常处理
builder.Services.AddControllers(a =>
{
a.Filters.Add(typeof(ExceptionPlugIn));
});

测试全局异常捕获机制

添加一个异常测试接口

运行测试

以上就是全局异常捕获机制,感兴趣的可以下载项目,修改吧。

源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api  

预览地址:http://139.155.137.144:8880/swagger/index.html

帮我Star,谢谢。

有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

(系列六).net8 全局异常捕获机制的更多相关文章

  1. gRPC全局异常捕获

    gRPC全局异常捕获 引 一般的.net项目比如ASP.NET.控制台程序.Windows服务.桌面程序等都会有framework自带的全局异常捕获机制.ASP.NET的ExceptionFilter ...

  2. Configure、中间件与ErrorHandlingMiddleware全局异常捕获

    一.Configure Startup.cs中的Configure方法主要是http处理管道配置.中间件和一些系统配置,其中 IApplicationBuilder: 定义一个类,该类提供配置应用程序 ...

  3. Android全局异常捕获

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

  4. SpringBoot图文教程15—项目异常怎么办?「跳转404错误页面」「全局异常捕获」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...

  5. MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获

    public class BaseController : Controller { /// <summary> /// Called after the action method is ...

  6. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

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

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

  8. Spring-MVC开发之全局异常捕获全面解读

    异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...

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

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

  10. 使用spring利用HandlerExceptionResolver实现全局异常捕获

    最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...

随机推荐

  1. Springboot实现HTML表单from简单的接收信息

    HTML< from >元素 from可向Web服务器提交请求 普遍格式: <from action="服务器地址" method="请求方式" ...

  2. 如何安装废弃版本的Jax —— pypi服务器上不保存的python包应该如何安装

    python的公开扩展包的存储是在网站: http://pypi.org/ 一般情况下,这是没有问题的,但是对于一些更新版本比较多的扩展包就出现了问题,因为pypi的服务器对每个项目(扩展包)都是由存 ...

  3. .Net Aspire初体验

    今天参加了Post Microsoft Build & AI Day深圳的集会,众多大佬分享了非常优质前沿的技术和实践,实在受益良多,为了消化吸收关于张队分享的.Net Aspire的内容,特 ...

  4. SMU Spring 2023 Contest Round 5(2023 (ICPC) Jiangxi Provincial Contest -- Official Contest)

    题目链接 Problem A. Drill Wood to Make Fire S * V >= n即可 #include<bits/stdc++.h> #define int lo ...

  5. 你要了解的2种AI思维链

    我们使用的AI助手,一般是经过了预训练和微调这2个步骤,尽管训练出的模型能回答许多通用类问题,但是在遇到复杂问题时还是束手无策. 直到有人提出了思维链方式,才解决了模型在面对复杂问题时的推理能力. 1 ...

  6. 【CMake系列】06-项目结构与输出路径管理

    为了对大型项目实现更好的管理[模块化协作开发等等],cmake 提供了很多指令,可以对项目的结构进行调整.管理,便于项目的合理规划.本文我们要学习的就是 项目结构的设置,以及 构建程序等 输出路径的设 ...

  7. XSS 基本概念和原理介绍

    XSS 基本概念和原理介绍 基本概念 跨站脚本攻击 XSS(Cross Site Scripting),为了不和层叠样式表 ( Cascading Style Sheets,CSS ) 的缩写混淆,故 ...

  8. containerd在线部署

    containerd的作用以及跟docker的区别 Containerd是一个用于管理容器生命周期的开源项目.它最初是从Docker项目中分离出来的,现在已经成为了一个独立的项目.它可以用作容器镜像管 ...

  9. Python 潮流周刊#66:Python 的预处理器(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  10. LaTeX 编译警告:Script 'CJK' not explicitly supported within font 'FandolSong-Regular'. Check the typeset output, and if it is okay then ignore this warning. Otherwise a different font should be chosen.

    在编译一篇中文文档时遇到如下警告: Package fontspec Warning: Script 'CJK' not explicitly supported within font 'Fando ...