淺談MVC異常處理

  在平常開發中,咱們會去捕捉不少的異常,來進行處理,一般咱們的方法就是,在須要進行異常處理的地方加上 try catch 塊,可是,若是須要異常處理的地方不少,那麼,就會頻繁的去寫try catch 塊,對於咱們天生‘懶惰’ 的程序員來講,總想找一個捷徑。因而,就會有全局異常處理,那麼,今天,咱們就來看看在MVC中怎麼進行全局異常處理的。html

1、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類中的某些屬性中找到的。ide

例如:一下是Error.cshtml。spa

咱們在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     }

運行一下,咱們來看一下結果。code

以上就是運行的結果,咱們能夠看到,System.Web.Mvc.HandleErrorInfo類仍是有不少豐富的屬性的,咱們能夠直接拿來用。htm

MVC自帶的這套異常處理默認的是處理錯誤碼爲500系列的異常,若是是404,就不會走這個了。不過,咱們能夠經過Web.config文件的設置,來進行處理。看咱們如何處理的。blog

首先,咱們先將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 }

頁面:

而後咱們在瀏覽器地址中寫一個錯誤的地址,看一下結果:

2、重寫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     }

這樣,咱們就能夠完成咱們的需求了。

相關文章
相關標籤/搜索