在日常開發中,我們會去捕捉很多的異常,來進行處理,通常我們的方法就是,在需要進行異常處理的地方加上 try catch 塊,但是,如果需要異常處理的地方很多,那麼,就會頻繁的去寫try catch 塊,對於我們天生‘懶惰’ 的程式員來說,總想找一個捷徑。於是,就會有全局異常處理,那麼,今天,我們就來 ...
在日常開發中,我們會去捕捉很多的異常,來進行處理,通常我們的方法就是,在需要進行異常處理的地方加上 try catch 塊,但是,如果需要異常處理的地方很多,那麼,就會頻繁的去寫try catch 塊,對於我們天生‘懶惰’ 的程式員來說,總想找一個捷徑。於是,就會有全局異常處理,那麼,今天,我們就來看看在MVC中怎麼進行全局異常處理的。
一、MVC框架自己的全局異常處理
在MVC中,框架已經給我們一共了一套全局異常處理的特性類HandleErrorAttribute類。我們可以在MVC中的App_Start文件夾中的FilterConfig.cs文件中找到這麼一行代碼
1 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 2 { 3 filters.Add(new HandleErrorAttribute()); 4 }
這個就是實例化一個HandleErrorAttribute類,放到過濾器中。然後我們的Views>Shared文件夾中有一個Error.cshtml的頁面,其中,該頁面里的Model的類型為System.Web.Mvc.HandleErrorInfo,這個是MVC框架已經給我寫好了的,我們可以直接拿來用。
在Error.cshtml頁面中,我們可以做進一步處理,來顯示錯誤信息,根據需求來展示錯誤信息。這些錯誤信息都會在System.Web.Mvc.HandleErrorInfo類中的某些屬性中找到的。
例如:一下是Error.cshtml。
我們在Control中,故意寫一個異常出來:
1 public class HomeController : Controller 2 { 3 public ActionResult Index() 4 { 5 string i = "12a"; 6 int j = Convert.ToInt32(i); 7 return View(); 8 } 9 }
運行一下,我們來看一下結果。
以上就是運行的結果,我們可以看到,System.Web.Mvc.HandleErrorInfo類還是有很多豐富的屬性的,我們可以直接拿來用。
MVC自帶的這套異常處理預設的是處理錯誤碼為500系列的異常,如果是404,就不會走這個了。不過,我們可以通過Web.config文件的設置,來進行處理。看我們如何處理的。
首先,我們先將Error.cshtml頁補充完整,先給他加一個Control,然後,我們再寫一個專門處理404的View和Control。如下
1 namespace Exception.Controllers 2 { 3 public class SharedController : Controller 4 { 5 // GET: Shares 6 public ActionResult Error() 7 { 8 return View(); 9 } 10 11 public ActionResult NotFondError() 12 { 13 return View(); 14 } 15 } 16 }
頁面:
然後我們在瀏覽器地址中寫一個錯誤的地址,看一下結果:
二、重寫MVC中的異常處理
在開發中,我們經常有這麼一個需求,我們需要將異常通過文本日誌的方式記錄下來並保存,那麼MVC自帶的異常處理方式System.Web.Mvc.HandleErrorInfo沒有這麼一個功能,那麼我們通過重寫的方式來讓它有這個功能。下麵,我們來看看如何重寫。
首先我們建一個類,讓這個類繼承System.Web.Mvc.HandleErrorInfo,然後重寫System.Web.Mvc.HandleErrorInfo中的虛方法:OnException方法。
1 public class CustomHandleErrorAttribute : HandleErrorAttribute 2 { 3 public override void OnException(ExceptionContext filterContext) 4 { 5 base.OnException(filterContext); 6 var err = filterContext.Exception.Message;//錯誤內容 7 //============================= 8 //將錯誤記錄到日誌中 9 //============================= 10 } 11 }
然後,將FilterConfig.cs加入:
1 public class FilterConfig 2 { 3 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4 { 5 filters.Add(new HandleErrorAttribute()); 6 filters.Add(new CustomHandleErrorAttribute()); 7 } 8 }
這樣,我們就可以完成我們的需求了。