.net core 5 入门(三)异常处理篇

异常处理篇

1.中间件处理异常

和上一篇的log4net配合使用

  public class ExceptionHandlingMiddleware
    {
        //处理http请求的函数
        private readonly RequestDelegate _next;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="next"></param>
        public ExceptionHandlingMiddleware(RequestDelegate next)
        {
            _next = next;
        }
        /// <summary>
        /// 收到http请求时
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (Exception ex)
            {
                var statusCode = context.Response.StatusCode;
                await HandleExceptionAsync(context, ex);
            }
        }
        /// <summary>
        /// 异常处理
        /// </summary>
        /// <param name="context"></param>
        /// <param name="ex"></param>
        /// <returns></returns>
        private Task HandleExceptionAsync(HttpContext context, Exception ex)
        {
            //写入日志
            Log4NetUtil.Error(ex.ToString());
            //返回json
            return context.Response.WriteAsync(JsonConvert.SerializeObject(ExceptionUtils.BuildExceptionResult(ex)));
        }
    }

2.startup注册

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMiddleware<ExceptionHandlingMiddleware>();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
            //app.UseKnife4jUIMiddlewaresHandling();
            app.UseSwaggerMiddlewaresHandling();

        }
  public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            //services.AddKnife4jSetup();
            services.AddSwaggerSetup();
            //初始化log4net
            Log4NetUtil.InitLog4Net();
            //注册全局异常过滤器
            services.AddMvc(options =>
            {
                options.Filters.Add<GlobalExceptionFilter>();//全局异常类
            });

        }

3.使用过滤器处理异常

 /// <summary>
    /// 全局异常过滤器
    /// </summary>
    public class GlobalExceptionFilter :  IExceptionFilter
    {
        /// <summary>
        /// 发生异常时
        /// </summary>
        /// <param name="context"></param>
        public void OnException(ExceptionContext context)
        {
            //如果异常没有被处理过
            if (!context.ExceptionHandled)
            {
                //发生异常的控制器
                string controllerName = (string)context.RouteData.Values["controller"];
                //发生异常的方法名
                string actionName = (string)context.RouteData.Values["action"];
                //写入日志
                string msgTemplate = $"在执行controller[{controllerName}的{actionName}]方法时产生异常]";
                Log4NetUtil.Error(context.Exception.ToString() + "\r\n" + msgTemplate);
                //异常标记为已处理
                context.ExceptionHandled = true;
                //返回异常结果json
                context.Result = new ObjectResult(ExceptionUtils.BuildExceptionResult(context.Exception));
            }
        }
    }

4.异常返回工具类

  /// <summary>
    /// 异常处理工具类
    /// </summary>
    public class ExceptionUtils
    {
        /// <summary>
        /// 包装处理异常格式
        /// </summary>
        /// <param name="ex"></param>
        /// <returns></returns>
        public static object BuildExceptionResult(Exception ex)
        {
            int code = 0;
            string message = "";
            string innerMessage = "";
            //应用程序业务级异常
            if (ex is ApplicationException)
            {
                code = 501;
                message = ex.Message;
            }
            else
            {
                // exception 系统级别异常,不直接明文显示的
                code = 500;
                message = "发生系统级别异常";
                innerMessage = ex.Message;
            }

            if (ex.InnerException != null && ex.Message != ex.InnerException.Message)
            {
                innerMessage += "," + ex.InnerException.Message;
            }

            return (new { code, message, innerMessage });
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值