首页 > 其他分享 >(系列六).net8 全局异常捕获机制

(系列六).net8 全局异常捕获机制

时间:2024-10-12 16:22:46浏览次数:9  
标签:receiveStatus ReceiveStatus 捕获 net8 msg 全局 异常 public

说明

    该文章是属于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,谢谢。

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

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

标签:receiveStatus,ReceiveStatus,捕获,net8,msg,全局,异常,public
From: https://www.cnblogs.com/cyzf/p/18460420

相关文章

  • InternVL2识别边界框实践:捕获股票K线图启明之星
    本文作者:谢志军,某互联网金融证券公司,算法工程师https://github.com/OpenGVLab/InternVL写在前面YOLO系列模型实现了对现实世界广泛物体的边界框识别,最新的开源多模态大模型(MLLM)/视觉语言模型(VLM)宣称能够给出特定物体的边界框坐标。笔者测试了一些常规图片并询问MLLM......
  • 关于C++当中全局变量的释放问题
    一、由来主要是在修改公司的一个MFC项目的时候遇到的问题,我在MFC页面的析构函数当中对一个全局图像变量进行了释放,具体如下:ai_engine_OCR::~ai_engine_OCR(){//及时释放内存if(g_pImg_open!=NULL){deleteg_pImg_open;g_pImg_open=NULL......
  • QT定时器+事件捕获
    QT定时器类定时器类的使用主要包括定时和启动两个步骤。要使用OTimer类,需要引用头文件:#include<QTimer>QTimer类常用的成员函数有(1)voidstart(std::chrono::milisecondsmsec):启动定时器,参数为定时时间(单位为毫秒),如:        QTimermyTimer;        ......
  • 如何在springboot中,全局配置produces="text/plain;charset=UTF-8"
    为什么要使用produces="text/plain;charset=UTF-8"?当不用这个配置时,接口返回的数据,是有斜杠的 配置后,就正常了 以前我的配置方式,是在每个接口上,都添加上produces="text/plain;charset=UTF-8"。但是这样显示不太好,每个接口都加的话,会比较耗费时间如何做到全局配置使用W......
  • 在Vue3中如何实现四种全局状态数据的统一管理?HB
    四种全局状态数据在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端)、同步数据。同步数据又分为三种:localstorage、cookie、内存。在传统的Vue3当中,分别采用不同的机制来处理这些状态数据,而在Zova中只需要采用统一的Model机制状态数据传统的Vue3Zova异......
  • c# 捕获系统快捷键并响应
    privatevoidGlobalKeyCapture_KeyDown(objectsender,KeyEventArgse){//判断当前进程是否是活动进程,以决定是否响应varcurrentProcess=getActiveProcess();if(currentProcess.Id!=Process.GetCurrentProcess().Id)return;if(e.KeyCode......
  • 在Vue3中如何实现四种全局状态数据的统一管理?
    四种全局状态数据在实际开发当中,会遇到四种全局状态数据:异步数据(一般来自服务端)、同步数据。同步数据又分为三种:localstorage、cookie、内存。在传统的Vue3当中,分别采用不同的机制来处理这些状态数据,而在Zova中只需要采用统一的Model机制状态数据传统的Vue3Zova异......
  • STM32中实现下降沿捕获(HAL库)
    配置步骤:1、配置时基工作参数HAL_TIM_IC_Init();主要配置其中的instanceinitautorelaodpreloadcountermodeperiodprescaler2、msp初始化HAL_TIM_IC_MspInit(TIM_HandleTypeDef*htim) __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();  HAL_NV......
  • antv X6 全局禁用节点和边拖动,画布可以拖动
    项目有个需求,通过接口获取用户权限,限制用户拖动节点和边查阅文档和百度发现Graph可以配置interacting来限制节点和边的交互但是用户的权限通过接口获取,如何动态配置interacting是否为false1、节点的node.prop可以进行通信,但是需要遍历画布的所有节点,参考https://codesa......
  • laravel11:添加全局中间件
    一,文档地址:https://docs.golaravel.com/docs/middleware注意选择11这个版本二,添加全局中间件时,需要添加到bootstrap/app.php文件中:1,useApp\Http\Middleware\EnsureTokenIsValid;->withMiddleware(function(Middleware$middleware){$middleware->append(Ensure......