并非所有的異常都需要 try-catch 進行重復的處理,這會導致大量的重復性代碼,一旦后續(xù)系統(tǒng)出現(xiàn)異常處理機制的修改,隨著代碼量增多,修改也會變的更加困難。
創(chuàng)新互聯(lián)秉承實現(xiàn)全網(wǎng)價值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都做網(wǎng)站、成都網(wǎng)站制作,微信平臺小程序開發(fā),網(wǎng)頁設計制作,手機網(wǎng)站開發(fā),成都營銷網(wǎng)站建設幫助傳統(tǒng)企業(yè)實現(xiàn)“互聯(lián)網(wǎng)+”轉型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術人才,對客戶都以感恩的心態(tài)奉獻自己的專業(yè)和所長。ASP.NET Web API 中特別增加了全局異常過濾器功能,諸如于此的還有很多過濾器可供開發(fā)者選擇,以實現(xiàn)面向切面編程,它們在取代重復性編碼這一目標的路上,作出很多貢獻,同時降低了后期維護代碼的難度,提升了可讀性。
大多數(shù)異常處理的 try-catch 都通常是同樣的寫法(記錄異常日志、返回錯誤信息等),因此我們可以將他們統(tǒng)一寫在一個過濾器中,讓 API 在出現(xiàn)異常時,即使沒有使用 try-catch 嵌套異常位置和解決方案,也能夠自動進入期望的異常處理方法。
注意:這是專門針對 Web API 所使用的全局異常處理器。如果是 Controller,則它有另外一套全局異常處理機制,因為通常情況下 MVC 的控制器不只返回Json字符串,通常要涉及頁面View,文件File,Json字符串等。
Get Start
下面我們以一個最簡單的異常處理過濾器代碼為例,來說明應當如何使全局異常處理器生效:
1.創(chuàng)建一個類 MyExceptionFilterAttribute,繼承 ExceptionFilterAttribute, System.Web.Mvc.IExceptionFilter 并實現(xiàn)接口方法
using Newtonsoft.Json;
using System.Net.Http;
using System.Web.Http.Filters;
using System.Web.Mvc;
namespace WebAPITest.Filters
{
public class MyExceptionFilterAttribute : ExceptionFilterAttribute, System.Web.Mvc.IExceptionFilter
{
//MVC過濾器要求必須繼承此接口才允許注冊,但我們可以繼承、實現(xiàn)但不寫它。
public void OnException(ExceptionContext filterContext)
{
? throw new NotImplementedException();
}
//真正能讓API全局異常過濾器在出現(xiàn)異常時生效的是這個家伙:
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
? base.OnException(actionExecutedContext);
actionExecutedContext.Response = new HttpResponseMessage() { Content = new StringContent("出現(xiàn)異常") };
? return;
}
}
2.為此全局異常處理器進行注冊:
打開文件夾 App_Start 下的 FilterConfig.cs 為過濾器注冊,由此才能使得過濾器生效。
特別說明:一旦進行了全局注冊,則所有方法出現(xiàn)異常時,過濾器都會生效。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyExceptionFilterAttribute());
}
作為特性標簽使用
當然,上述 MyExceptionFilterAttribute 除了可注冊為全局異常過濾器以外,也可以單獨為 API 中的某些方法使用:(注意,方法本身就是"try",過濾器是"catch"。所以不再需要在方法體內再次 try-catch)
using System.Net.Http;
using System.Web.Http;
using WebAPITest.Filters;
using WebAPITest.Models;
namespace WebAPITest.Controllers
{
//你也可以把過濾器標簽打在這個地方,這代表該API類下的所有接口均接受[MyExceptionFilter]接管異常處理。
public class TestController : ApiController
{
[MyExceptionFilter]???? //特性標簽打在此處,則 UserException 方法出現(xiàn)異常時會觸發(fā) MyExceptionFilterAttribute 中的異常處理方法。
public HttpResponseMessage UserException()
{
? throw new UserException("用戶異常");
}
[MyExceptionFilter]???? //同上,這一特性標簽將幫助 SystemException 方法處理異常。
public HttpResponseMessage SystemException()
{
? throw new Exception();
}
}
}
標簽與全局注冊的優(yōu)先級問題
多個特性標簽,可以全局注冊,可以單獨在方法名稱上、類名上混合使用,那么如果一個標簽被全局注冊,另一個標簽被單獨打在方法名上或者類名上,則最終哪一個處理器的方法會被觸發(fā)?
這些家伙的優(yōu)先級其實和 css 層疊樣式表的優(yōu)先級相仿。
即:如果我們全局注冊過一個過濾器A,又在 ApiController 類的最頂端打了另外一個B、又在Action方法上打了第三個異常處理器C,那么默認只會執(zhí)行最靠近 Action 的C處理器,也就是說:ActionFilter > ClassFilter > GlobalFilter。
另外如果需要多次執(zhí)行全部生效,即:全局一次,Controller類一次,Action一次,那么則需要為過濾器頂端加那么一個標簽 [AttributeUsage(AttributeTargets.All,AllowMultiple = true)],然后當異常觸發(fā)時,他們就能夠支持多次執(zhí)行。
當然,真正的異常處理還會涉及很多復雜的內容,這只是一個概覽。例如返回值需要被標準化(包含狀態(tài)碼、消息、響應流等內容),調用異常處理工具向服務器發(fā)送異常信息記錄,記錄請求參數(shù),對GET/POST請求導致異常的差異化處理方法等。
但我們在這里提供的是一個思路,讓你知道,精簡代碼、提升開發(fā)效率其實可以有更多的方法和可能性。而不必非要使用同一種方式,當你覺得某些步驟一直在不斷重復,則應當已經有早期的開發(fā)者給出了解決方案,而你需要去發(fā)現(xiàn)他們。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。
網(wǎng)站題目:在ASP.NETWebAPI中使用Attribute統(tǒng)一處理異常-創(chuàng)新互聯(lián)
分享地址:http://jinyejixie.com/article40/dpopeo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、用戶體驗、網(wǎng)站建設、品牌網(wǎng)站設計、響應式網(wǎng)站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)