错误捕捉过滤器 .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
}

浙公网安备 33010602011771号