在ASP.NET中,錯誤處理是通過使用標準的嘗試捕捉方法或使用應用程式事件。ASP.NET MVC附帶內置支持,被稱為異常篩檢程式功能異常處理。在這裏我們要學習兩種方法:一個是定義HandleError篩檢程式,另一個是重寫onException方法。
覆蓋onException方法
使用這種方式在當要處理整個操作方法所有的異常在控制器級別。
要理解這種方式,創建一個MVC應用程式(包括跟隨在前面章節中的步驟)。現在添加一個新的控制器類,並添加以下代碼將覆蓋onException方法,並明確在行動方法拋出一個錯誤:

現在,讓我們創建一個通用的視圖名為Error,顯示給用戶在任何異常的應用程式發生時。在Views檔夾內,創建一個名為Shared的新檔夾,並添加一個新的名為Error的視圖。

拷貝下麵下麵的代碼到新建檔: Error.cshtml:

如果現在嘗試運行應用程式,它會給出結果如下。當任何異常發生在控制器內的操作方法時,上面的代碼會渲染錯誤在視圖中。

這種方法的優點是,在同一個控制器中的多個動作可以共用這個錯誤處理邏輯。 但是,缺點是不能跨越多個控制器使用相同的錯誤處理邏輯。
HandleError屬性
HandleError的屬性是學習篩檢程式過濾操作之一,在操作篩檢程式的篇章。HandleErrorAttribute是IExceptionFilter是的默認實現。該篩檢程式處理所有的控制器動作,篩檢程式和視圖引發的例外。
要使用此功能,首先打開web.config檔的customErrors部分。打開web.config把System.Web下麵的代碼,並將其值設置為ON。
<customErrors mode="On"/>
我們已經有了下查看Shared檔夾中創建的錯誤視圖。這一次,這個視圖檔的代碼更改為強類型,鍵入使用HandleErrorInfo模型(這是System.Web.MVC下存在):
@model System.Web.Mvc.HandleErrorInfo @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Error</title> </head> <body> <h2> Sorry, an error occurred while processing your request. </h2> <h2>Exception details</h2> <p> Controller: @Model.ControllerName <br> Action: @Model.ActionName Exception: @Model.Exception </p> </body> </html>
現在,將下麵的代碼在控制器檔,其中規定在控制器檔[HandleError]屬性。
using System; using System.Data.Common; using System.Web.Mvc; namespace ExceptionHandlingMVC.Controllers { [HandleError] public class ExceptionHandlingController : Controller { public ActionResult TestMethod() { throw new Exception("Test Exception"); return View(); } } }
如果嘗試現在運行的應用程式,會得到類似如下的錯誤:

正如所看到的,這一次的錯誤包含了控制器和動作細節相關的更多資訊。以這種方式,HandleError可用於在任何級別和跨控制器處理這樣的錯誤。