.net5 - 创建Web.Api项目(五)异常过滤器【自定义异常/统一异常处理】

概念

 异常过滤器是一种可以在 WebAPI 中捕获那些未得到处理的异常的过滤器,要想创建异常过滤器,你需要实现 IExceptionFilter 接口,不过这种方式比较麻烦,更快捷的方法是直接继承 ExceptionFilterAttribute 并重写里面的 OnException() 方法即可,这是因为 ExceptionFilterAttribute 类本身就实现了 IExceptionFilter 接口

全局

XXX.Common项目下新建自定义异常类:新建文件夹【Custom】新建类:BusinessException.cs【名字自己定义】

using System;

namespace Jwt.Common.Custom
{
  /// <summary>
  /// 业务异常
  /// </summary>
  public class BusinessException : Exception
  {
    public BusinessException(string message) : base(message)
    {
    }
  }
}

WebApi项目下新建文件夹【Custom/Exception】,在Exception文件夹下新建类:CustomExceptionFilterAttribute

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Configuration;
using Test.Common.Custom;

namespace Test.WebApi.Custom.Exception
{
    public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly IConfiguration _configuration;

        public CustomExceptionFilterAttribute(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        public override void OnException(ExceptionContext context)
        {
            #region 自定义异常
            if (context.Exception.GetType() == typeof(BusinessException))
            {
                ResponseDto response = new ResponseDto()
                {
                    Success = false,
                    Message = context.Exception.Message
                };
                context.Result = new JsonResult(response);
            }
            #endregion

            #region 捕获程序异常,友好提示
            else
            {
                ResponseDto response = new ResponseDto()
                {
                    Success = false,
                    Message = "服务器忙,请稍后再试"
                };
                if (_configuration["AppSetting:DisplayExceptionOrNot"] == "1")
                {
                    response.Message = context.Exception.Message;
                }
                context.Result = new JsonResult(response);
            }
            #endregion
        }
    }
}

Startup中注册

                options.Filters.Add<CustomExceptionFilterAttribute>();

  

缩小粒度到 Controller 或者 Action 级别
[DatabaseExceptionFilter]
public class EmployeesController : ApiController
{
    //Some code
}

 [CustomExceptionFilter]
 public IEnumerable<string> Get()
 {
    throw new DivideByZeroException(); 
 }

  

posted @ 2021-03-04 10:22  gygtech  Views(926)  Comments(0Edit  收藏  举报