在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> |