错误捕捉过滤器 .NetCore版

前言

继承ExceptionFilterAttribute后,重写OnException函数。
统一捕捉所有报错,格式化返回前端。

代码实现

基类控制器

在基类控制器上添加[ErrorCatch]特性:
(.NetCore3中没有JsonResult,从使用习惯出发,使用自己写的JsonContentResultBuilder返回JSON格式的ContentResult)
注意:配合之前的编写的(参数模型检验过滤器 .NetCore版),可以将参数校验的报错统一用此特性格式化之后返回

    /// <summary>
    /// 基类控制器
    /// </summary>
    [ParaModelValidate]
    [ErrorCatch]  
    public class BaseController : ControllerBase
    {
        public ContentResult JsonResult(dynamic data = null)
        {
            ContentResult result = JsonContentResultBuilder.BuildViewJsonResult(data);

            return result;
        }
    }

控制器接口

    public class DemoController : BaseController
    {

        public ActionResult Login(DemoParaModel paraModel)
        {

            throw new Exception("报错了");

            return JsonResult(ss);
        }
    }

ErrorCatchAttribute特性

    /// <summary>
    /// 错误捕捉过滤器 NetCore版
    /// </summary>
    public class ErrorCatchAttribute : ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext actionExecutedContext)
        {

            ContentResult result = JsonContentResultBuilder.BuildViewJsonResult(null, StatuCode.Fail, actionExecutedContext.Exception.Message);
            actionExecutedContext.Result = result;

        }
    }

JsonContentResultBuilder

    public class JsonContentResultBuilder
    {

        public static ContentResult BuildViewJsonResult(dynamic data, StatuCode statuCode= StatuCode.Success, string errorMessage = null)
        {
            string statuDescription = statuCode.Description();
            string separator = !string.IsNullOrEmpty(statuDescription) ? ":" : string.Empty;

            JsonResult result = new JsonResult
            {
                Code = statuCode,
                Message = !string.IsNullOrEmpty(errorMessage)
                    ? $"{statuDescription}{separator}{errorMessage}"
                    : statuDescription,
                Data = data,
            };

            return new ContentResult
            {

                ContentType = "application/json",
                Content = JsonConvert.SerializeObject(result)

            };

        }
    }

JsonResult

    public class JsonResult
    {
        public StatuCode Code { get; set; }

        public string Message { get; set; }

        public object Data { get; set; }
    }

    public static class ErrorCodeHelper
    {
        public static string Description(this StatuCode enumName)
        {
            return EnumHelper.GetDescriptionByName(enumName);
        }
    }

    public enum StatuCode
    {
        [Description("成功")]
        Success = 00000000,
        [Description("失败")]
        Fail = 00000001
    }
posted @ 2021-01-18 09:16  sorachannel  阅读(118)  评论(0)    收藏  举报