翼度科技»论坛 编程开发 .net 查看内容

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

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。
    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。
    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。
友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。
有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我
为什么要用全局异常捕获?
对于一个系统来说,全局异常捕获是必不可少的,它不仅可以把异常信息精简后反馈给用户,还能帮助程序员减少解决问题的时间,以及记录系统中任何一处发生异常的信息。
你是否依然有以下苦恼?
你是否还在为怎么记录系统异常日志而苦恼?
你是否还在为系统报错位置和报错信息苦恼?
你是否还在每个接口处增加日志记录操作?
如果你有,那么本篇文章正好可以解决你的难题。
什么是全局异常捕获机制?
全局异常捕获,顾名思义就是系统无论在那个位置发生错误都会被捕获,从而进行处理。
创建接口返回模型
创建一个接口返回模型:ReceiveStatus.cs 
它的主要作用是把接口返回的数据、信息推送给前端。
  1. /// <summary>
  2. /// 接口返回实体模型
  3. /// </summary>
  4. public class ReceiveStatus
  5. {
  6.      /// <summary>
  7.      /// 编码
  8.      /// </summary>
  9.      public CodeStatuEnum code { get; set; }
  10.      /// <summary>
  11.      /// 信息
  12.      /// </summary>
  13.      public string msg { get; set; }
  14.      /// <summary>
  15.      /// 是否成功
  16.      /// </summary>
  17.      public bool success { get; set; }
  18.      /// <summary>
  19.      /// 构造函数
  20.      /// </summary>
  21.      public ReceiveStatus()
  22.      {
  23.          code = CodeStatuEnum.Successful;
  24.          success = true;
  25.          msg = "操作成功";
  26.      }
  27. }
  28. /// <summary>
  29. /// 接口返回结果集
  30. /// </summary>
  31. /// <typeparam name="T"></typeparam>
  32. public class ReceiveStatus<T> : ReceiveStatus
  33. {
  34.      /// <summary>
  35.      /// 数据
  36.      /// </summary>
  37.      public List<T> data { get; set; }
  38.      /// <summary>
  39.      /// 总数量
  40.      /// </summary>
  41.      public int total { get; set; }
  42. }
复制代码
  1. CodeStatuEnum.cs枚举值如下
复制代码
  1. /// <summary>
  2. /// 代码状态枚举
  3. /// </summary>
  4. public enum CodeStatuEnum
  5. {
  6.      /// <summary>
  7.      /// 操作成功
  8.      /// </summary>
  9.      Successful = 200,
  10.      /// <summary>
  11.      ///  警告
  12.      /// </summary>
  13.      Warning = 99991,
  14.      /// <summary>
  15.      /// 操作引发错误
  16.      /// </summary>
  17.      Error = 99992
  18. }
复制代码
创建好接口返回模型后,我们创建一个异常帮助类,它的主要用途,是区分【系统异常】还是用户自定义的【业务异常】。
  1. /// <summary>
  2. /// 异常帮助类
  3. /// </summary>
  4. public class ExceptionHelper
  5. {
  6.     /// <summary>
  7.     /// 自定义异常(会写入错误日志表)
  8.     /// </summary>
  9.     /// <param name="msg"></param>
  10.     public static void ThrowBusinessException(string msg)
  11.     {
  12.         throw new Exception(msg);
  13.     }
  14.     /// <summary>
  15.     /// 自定义业务异常(不会写入错误日志表)
  16.     /// </summary>
  17.     /// <param name="msg">信息信息</param>
  18.     /// <param name="codeStatu">异常状态</param>
  19.     /// <returns>返回结果集</returns>
  20.     public static ReceiveStatus CustomException(string msg, CodeStatuEnum codeStatu = CodeStatuEnum.Warning)
  21.     {
  22.         ReceiveStatus receiveStatus = new();
  23.         receiveStatus.code = codeStatu;
  24.         receiveStatus.msg = msg;
  25.         receiveStatus.success = false;
  26.         return receiveStatus;
  27.     }
  28. }
  29. /// <summary>
  30. /// 异常帮助类(返回数据)
  31. /// </summary>
  32. /// <typeparam name="T"></typeparam>
  33. public class ExceptionHelper<T> : ExceptionHelper
  34. {
  35.     /// <summary>
  36.     /// 自定义业务异常(不会写入错误日志表)
  37.     /// </summary>
  38.     /// <param name="msg">信息信息</param>
  39.     /// <param name="codeStatu">异常状态</param>
  40.     /// <returns>返回结果集</returns>
  41.     public static ReceiveStatus<T> CustomExceptionData(string msg, CodeStatuEnum codeStatu = CodeStatuEnum.Warning)
  42.     {
  43.         ReceiveStatus<T> receiveStatus = new();
  44.         receiveStatus.code = codeStatu;
  45.         receiveStatus.msg = msg;
  46.         receiveStatus.success = false;
  47.         receiveStatus.data = new System.Collections.Generic.List<T>();
  48.         return receiveStatus;
  49.     }
  50. }
复制代码
创建全局异常捕获中间件
在wenApi启动项目中创建一个类:ExceptionPlugIn.cs 
它的主要作用就是捕获系统中发生异常对代码和记录异常日志。
它需要继承一个接口:IAsyncExceptionFilter
  1. /// <summary>
  2. /// 全局异常捕获中间件
  3. /// </summary>
  4. public class ExceptionPlugIn : IAsyncExceptionFilter
  5. {
  6.     /// <summary>
  7.     /// 全局异常捕获接口
  8.     /// </summary>
  9.     /// <param name="context"></param>
  10.     /// <returns></returns>
  11.     public Task OnExceptionAsync(ExceptionContext context)
  12.     {
  13.         //异常信息
  14.         Exception ex = context.Exception;
  15.         //异常位置
  16.         var DisplayName = context.ActionDescriptor.DisplayName;
  17.         //异常行号
  18.         int lineNumber = 0;
  19.         const string lineSearch = ":line ";
  20.         var index = ex.StackTrace.LastIndexOf(lineSearch);
  21.         if (index != -1)
  22.         {
  23.             var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
  24.             lineNumber = Convert.ToInt32(lineNumberText.Substring(0, lineNumberText.IndexOf("\r\n")));
  25.         }
  26.         // 如果异常没有被处理则进行处理
  27.         if (context.ExceptionHandled == false)
  28.         {
  29.             string exceptionMsg = "错误位置:" + DisplayName + "\r\n" + "错误行号:" + lineNumber + "\r\n" + "错误信息:" + ex.Message;
  30.             // 定义返回类型
  31.             var result = new ReceiveStatus<string>
  32.             {
  33.                 code = CodeStatuEnum.Error,
  34.                 msg = "错误信息:" + exceptionMsg,
  35.                 success = false,
  36.             };
  37.             context.Result = new ContentResult
  38.             {
  39.                 // 返回状态码设置为200,表示
  40.                 StatusCode = StatusCodes.Status500InternalServerError,
  41.                 // 设置返回格式
  42.                 ContentType = "application/json;charset=utf-8",
  43.                 Content = JsonConvert.SerializeObject(result)
  44.             };
  45.             //记录日志
  46.         }
  47.         // 设置为true,表示异常已经被处理了
  48.         context.ExceptionHandled = true;
  49.         return Task.CompletedTask;
  50.     }
  51. }
复制代码
可以在OnExceptionAsync方法中添加记录日志、异常类型、异常分析等代码。
添加到服务中
编写好异常捕获机制后,我们需要把该类添加到Program.cs的服务中
  1. //自定义全局异常处理
  2. builder.Services.AddControllers(a =>
  3. {
  4.     a.Filters.Add(typeof(ExceptionPlugIn));
  5. });
复制代码

测试全局异常捕获机制
添加一个异常测试接口

运行测试

以上就是全局异常捕获机制,感兴趣的可以下载项目,修改吧。
源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api  
预览地址:http://139.155.137.144:8880/swagger/index.html
帮我Star,谢谢。
有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

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

来源:https://www.cnblogs.com/cyzf/p/18460420
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具