.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(); 
 }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM