標籤:
本文主要參考:http://www.asp.net/web-api/overview/error-handling/exception-handling
1、如果一個Web API控制器拋出未捕獲的異常,預設情況下,大多數異常轉換成HTTP響應狀態代碼500內部伺服器錯誤。
HttpResponseException類型是一個特例。這個異常返回任何HTTP狀態碼中指定異常建構函式。例如,下面的方法如果參數id是無效的,請求將返回404。
public Product GetProduct(int id){ Product item = repository.Get(id); if (item == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return item;}
當然你還可以通過HttpResponseException來構建完整的響應訊息。
public Product GetProduct(int id){ Product item = repository.Get(id); if (item == null) { var resp = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent(string.Format("No product with ID = {0}", id)), ReasonPhrase = "Product ID Not Found" } throw new HttpResponseException(resp); } return item;}
異常過濾器
你可以通過自訂一個異常過濾器來抓取所有使用者未處理的異常。當然,不包括HttpResponseException類型的異常,它是一個特例,因為它直接返回一個http訊息。
異常處理器繼承自System.Web.Http.Filters.IExceptionFilter介面。建立一個異常處理器最快的方式是繼承System.Web.Http.Filters.ExceptionFilterAttribute類,並重寫(override)OnException方法。
web api中的異常處理器和MVC中異常處理器非常類似,儘管它們來自不同的命名空間和和函數。
下面這個例子實現了一個異常過濾器,它把NotImplementedException異常轉換成http 501錯誤。
namespace ProductStore.Filters{ using System; using System.Net; using System.Net.Http; using System.Web.Http.Filters; public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext context) { if (context.Exception is NotImplementedException) { context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); } } }}
如何來註冊這些自訂的異常處理器呢?
系統提供了如下三種註冊方式
1、Action上註冊
public class ProductsController : ApiController{ [NotImplExceptionFilter] public Contact GetContact(int id) { throw new NotImplementedException("This method is not implemented"); }}
2、控制器上註冊
[NotImplExceptionFilter]public class ProductsController : ApiController{ public Contact GetContact(int id) { throw new NotImplementedException("This method is not implemented"); }}
3、全域註冊
public static class WebApiConfig{ public static void Register(HttpConfiguration config) { config.Filters.Add(new ProductStore.NotImplExceptionFilterAttribute()); // Other configuration code... }}
HttpError
HttpError對象為在http響應報文中返回錯誤資訊提供一個一致的方法,下面是一個在http響應報文中返回一個404錯誤的例子:
public HttpResponseMessage GetProduct(int id){ Product item = repository.Get(id); if (item == null) { var message = string.Format("Product with id = {0} not found", id); return Request.CreateErrorResponse(HttpStatusCode.NotFound, message); } else { return Request.CreateResponse(HttpStatusCode.OK, item); }}
下面例子中示範如何通過HttpError返回模型驗證錯誤資訊
public HttpResponseMessage PostProduct(Product item){ if (!ModelState.IsValid) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); } // Implementation not shown...}
HttpResponseException和HttpError一起使用
public Product GetProduct(int id){ Product item = repository.Get(id); if (item == null) { var message = string.Format("Product with id = {0} not found", id); throw new HttpResponseException( Request.CreateErrorResponse(HttpStatusCode.NotFound, message)); } else { return item; }}
Asp.Net Web Api 中的異常處理