一、應用場景
對于B/S應用程序,在部署到正式環境運行的過程中,很有可能出現一些在前期測試過程中沒有發現的一些異?;蛘咤e誤,或者說只有在特定條件滿足時才會發生的一些異常,對于使用ASP.NET MVC開發的應用程序站點,在部署到IIS上后,如果開發人員未對程序進行錯誤處理,那么一旦程序出現未處理的錯誤或異常,用戶將看到一個讓人感到及其困惑的錯誤堆棧跟蹤頁面,使得站點的用戶體驗下降,從程序的角度上來說,不做自定義錯誤處理也不利于程序出問題時的根源查找,因為很多時候有些錯誤只在特定條件下滿足時才重現,一旦錯過,可能就需要花大量時間去測試來重現問題,如果此時開發人員有對程序中的運行時異常進行日志記錄,那么或許將提供一些有價值的錯誤根源信息,下面我將向下大家講解如何實現自定義異常處理并跳轉到友好的錯誤提示頁面。
二、異常處理&自定義錯誤頁
1、通過異常過濾器 實現異常處理和自定義錯誤頁
asp.net mvc 提供了 異常過濾器 的方式來實現當執行controller中某個action方法時拋出了未處理的異常時的捕捉,mvc中的異常過濾器是以特性(Attribute)的形式存在的,定義一個自定義異常過濾器只需要兩個步驟:
1、定義一個類,繼承FilterAttribute類,并實現IExceptionFilter接口 2、應用自定義異常過濾器至指定的 action方法 或 controller類 或 全局應用。
異常過濾器代碼
using log4net;using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace Blog20180413.Filters{ public class CustomExceptionFilterAttribute : FilterAttribute, IExceptionFilter { //log4net組件,用于日志記錄。 static readonly ILog log = LogManager.GetLogger(typeof(CustomExceptionFilterAttribute)); public void OnException(ExceptionContext filterContext) { //對捕獲到的異常信息進行日志記錄,方便開發人員排查問題。 log.Error("應用程序異常", filterContext.Exception); //跳轉到自定義的錯誤頁,增強用戶體驗。 ActionResult result = new ViewResult() { ViewName = "CustomErrorPage" }; filterContext.Result = result; //異常處理結束后,一定要將ExceptionHandled設置為true,否則仍然會繼續拋出錯誤。 filterContext.ExceptionHandled = true; } }}使用異常過濾器
using Blog20180413.Filters;using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace Blog20180413.Controllers{ public class TestExceptionHandleController : Controller { [CustomExceptionFilter] public ActionResult Index() { string str = string.Empty; //將拋出轉換異常 int result = int.Parse(str); return View(); } }}注意:
第二個步驟中提到,可以將自定義異常過濾器 只應用到 action或者controller,如果只想將指定的異常過濾器以特性的形式應用到指定的一個或者多個controller或者action,而不想應用到所有的controller或者action,那么必須將該異常過濾器繼承FilterAttribute類,這是因為mvc框架是通過FilterAttributeFilterProvider.GetFilters來獲取標記在指定controller或者action上的異常過濾器特性的,而GetFilters內部邏輯要求必須繼承自FilterAttribute類。
新聞熱點
疑難解答
圖片精選