在ASP.NET MVC中,我們可以使用HandleErrorAttribute特性來具體指定如何處理Action拋出的異常.只要某個Action設置了HandleErrorAttribute特性,那么默認的,當這個Action拋出了異常時MVC將會顯示Error視圖,該視圖位於~/Views/Shared目錄下.
設置HandleError屬性
可以通過設置下面這些屬性來更改HandleErrorAttribute特性的默認處理:
ExceptionType.指定過濾器處理那種或哪些類型的異常,如果沒有指定該屬性,過濾器將會處理所有的異常.
View.指定發生異常時過濾器要顯示的視圖名稱.
Master.指定視圖母版的名稱,如果有的話.
Order.指定過濾器應用的順序,如果一個Action有多個HandleErrorAttribute過濾器.
指定Order屬性
如果某個Action設置了多個HandleErrorAttribute,Order屬性可以用來確定使用哪個過濾器.其值可以設置為從-1(最高優先級)到任何正整數之間的整數來標識其優先級,值越大,優先級別越低.Order屬性遵循以下規則:
應用到Controller上的過濾器將會自動應用到該Controller的所有Action上.
如果Controller和Action都應用了HandleErrorAttribute,那么只要Order屬性值相同,將會先執行Controller上的過濾器,而后才會執行Action上的過濾器.
對於相同Order屬性的過濾器,其執行先后次序不定.
如果沒有指定Order屬性,則默認為-1,這意味着該過濾器將比其他的過濾器優先執行,除非其他過濾器指定了Order為-1.
如果有多個過濾器可適用,那么第一個可以處理該異常的過濾器會被首先調用,然后針對該異常的處理將會終結.
在View中獲取異常信息
ASP.NET MVC框架將異常信息存儲在ViewDataDictionary中來傳遞給Error視圖,該ViewDataDictionary的Model屬性即是ExceptionContext類的一個實例,這個ViewData有下面幾個鍵:
ActionName:目標Action方法的名稱
ControllerName:目標Controller的名稱
Exception:異常對象.
啟用自定義錯誤處理
下面我們來開啟用於HandleErrorAttribute過濾器的自定義錯誤處理,打開程序的Web.config文件,在system.web節中加入一個customErrors元素,如下所示
<system.web> <customErrors mode="On" defaultRedirect="Error" /> </system.web>
處理Error視圖中的錯誤
有時候在Error視圖中也會發生錯誤,這時ASP.NET將會顯示其默認的錯誤頁面(黃底紅字),為了避免這種情況的出現,我們在Web.config文件的customErrors節中來自定義錯誤頁面,如下:
<system.web> <customErrors mode="On" defaultRedirect="GenericErrorPage.htm"> <error statusCode="500" redirect="/Error.htm" /> </customErrors> </system.web>