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就設定完成了。
- 首先先建立一個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; }
}
- 註冊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的回傳結果,是預設的錯誤訊息