[ASP.NET Web API]Exception Filter

  • 2680
  • 0
  • 2021-09-09

Exception Filter主要可以用於攔截非預期的例外錯誤。

攔截錯誤後,你可以做任何其他錯誤處理,例如:記錄Log、客製化且統一錯誤內容回傳的顯示方式,不需要一支一支的寫try catch做處理,這樣可以使程式寫起來較簡潔,也統一控管例外錯誤的處理,突然想要改變回傳格式時,也不用一支一支的調整改到昏頭了。

Filter的種類

其實還有以下的過濾器可以運用,但目前這篇文章主要專注在介紹異常過濾器(Exception Filters)

  • 驗證過濾器(Authorization filters):驗證是否有權限可以執行action,是所有過濾器中最早執行的
  • 動作過濾器(Action filters):動作過濾器會運行兩個方法,OnActionExecuting及OnActionExecued,分別在action前及後運行,可以執行其他處理,例如檢查資料格式或是取消action執行。
  • 結果過濾器(Result filters):結果過濾器會運行兩個方法,OnResultExecuting及OnResultExecuted,分別在ActionResult前後執行,可以執行其他處理。
  • 異常過濾器(Exception filters):本文介紹。

如何使用

只需要做兩個步驟,基本的Exception Filter就設定完成了。

  1. 首先先建立一個Class,繼承ExceptionFilterAttribute,且override OnException方法,將需要執行的例外處理寫在OnException方法中
public class ExceptionAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        //統一回傳的格式
        var result = new ResultModel
        {
            isException = true,
            ExceptionMsg = actionExecutedContext.Exception.Message
        };
        actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(result);
    }
}
  • 因為我例外處理是做統一回傳的格式,所以有另外建立一個Model方便統一、擴充格式
public class ResultModel
{
    public bool isException { get; set; } //是否有例外錯誤
    public string ExceptionMsg { get; set; } //例外錯誤的訊息
    public object data { get; set; }
}
  1. 註冊Exception Filter:有三種方式可以註冊例外狀況,可以較彈性的去註冊例外狀況
  • 動作(Action):只有某個action需要做自訂的例外處理,則加Exception的Attribute在action上即可
  • 控制站(Controller):只有某個controller需要做例外處理,則加Exception的Attribute在action上即可,controller內的所有action就都套用
  • 全域(Global):大部分的controller及action都要套用其例外處理,則加在全域會比較方便,註冊在全域的話需再WebApiConfig.cs中,加入剛剛寫好的ExceptionFilter

 

GlobalConfiguration.Configuration.Filters.Add(new Filters.ExceptionAttribute());

 

測試時間

這次我寫了action方法,一個有套用Exception Filter,一個沒有套用

套用Exception Filter的回傳結果,順利的format,發生例外後的回傳資料

沒有套用Exception Filter的回傳結果,是預設的錯誤訊息

參考資料