在編寫WebAPI時,若是在每一個控制器中都必須加入例外狀態的處理,是一件很麻煩又很難進行程式碼的管理
透過在控制器上加入Attribute,也就是採用AOP(Aspect-Oriented Programming)的處理,就可以統一進行例外狀態的管理與程式碼的編寫
要在WevAPI控制器中加入共用例外狀態處理的AOP程式碼很簡單,幾個步驟就可以完成了
首先先在程式碼專案中,加入一個ExceptionHandle.cs的類別庫
接著將下面的程式碼加入至該類別庫之中
using System.Web.Http.Filters;
using System.Net;
using System.Net.Http;
public class ExceptionHandle : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is NotImplementedException)
{
// 尚未實作的例外狀態
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
}
else
{
// 其他的狀態,回傳400的Status Code
context.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
}
}
}
在這段程式碼之中,主要的目的是繼承ExceptionFilterAttribute的類別,並覆寫OnException的副程式
在覆寫的內容中,我先加入一個判斷,判斷尚未實作與其他例外狀態時,會回傳不同的HttpStatusCode
只要這一個類別庫放在專案中,就可以透過Attribute的方式引入至WebAPI的控制器上
所以當WebAPI的控制器中,加入[ExceptionHandle]的Attribute後,就可以直接攔截到例外狀態的訊息,並加以處理了
[ExceptionHanlde]
public string Get(int id)
{
var strValues = new string[] { "1", "2" };
return strValues[2];
}
這段程式碼是我故意定義長度為2的字陣列,但是硬要回傳第三個位置的字串
當發生例外狀態的時候,OnException就會攔截並取得例外訊息的內容
而測試REST API的工具,也會得到HttpStatusCode為400的錯誤訊息
透過繼承ExceptionFilterAttribute與覆寫OnException的方式,在控制器中加入對應的Attribute,很容意的就可以達到統一管理例外狀態的功能,也可以大幅降低編寫例外處理程式碼的程式碼數量了