HandleError過濾器
[HandleError]過濾器提供了一種聲明的方式,來在一個Controller或一個Action方法上表示,如果在處理一個ASP.NET MVC請求中發生錯誤的話,應該顯示一個友好的錯誤回復。
要試驗一下的話,在項目中加一個新的TestController,實現一個action方法,在其中象下面這樣拋出一個異常:
在默認情形下,如果將瀏覽器指向這個URL的話,它會給遠程用戶顯示一個默認的ASP.NET錯誤網頁(除非你去web.config文件中配置了<customErrors>節):
我們可以在我們的Controller類或其中的Action方法上加一個[HandleError]屬性,來改變要顯示的HTML錯誤,而顯示對終端用戶比較友好的信息:
HandleError過濾器會捕捉住所有的異常(包括處理視圖模板時拋出的錯誤),在出錯時顯示一個定製的Error視圖回復。在默認情形下,它試圖在你的項目中尋找一個名為「Error」的視圖模板來生成回復。你可以將「Error」視圖置於同個Controller相應的視圖的目錄之中(例如,上面的TestController的ViewsTest目錄),也可以置於ViewsShared文件夾中(系統會先找一個特定於控制器的出錯視圖,如果沒找到的話,會在Shared文件夾中尋找,該文件夾包含了為所有控制器所共享的視圖)。
從第四個預覽版開始,在你創建新的ASP.NET MVC項目時,Visual Studio現在會自動為你在ViewsShared文件夾中加一個默認的「Error」視圖模板:
在我們的TestController類上加[HandleError]屬性後,在默認情形下,它會給遠程用戶顯示一個象下面這樣的HTML錯誤頁面(注意,它使用了項目的母板頁,這樣就將錯誤信息集成進了站點之中)。很明顯地,你可以去定製這個Error視圖模板,顯示你想要的任何HTML或者更加友好的錯誤信息,下面只不過是隨該版本而來的原裝的信息:
為幫助開發人員,在本地瀏覽應用時,Visual Studio中由新的項目模板提供的默認的Error視圖模板還會顯示額外的錯誤堆棧跟蹤信息:
你可以在Error視圖模板中將代碼刪除來將其關閉,或者也可以在你的web.config文件中將<customErrors>設成「Off」。
在默認情形下,[HandleError]過濾器將捕捉和處理請求中拋出的所有異常。你也可以在[HandleError]屬性上指定 "ExceptionType"和"View"屬性來指定你感興趣的特定異常類型,以及指定定製的錯誤視圖:
在上面的代碼中,我選擇為SqlException和NullReferenceException異常顯示定製的錯誤視圖,所有其它的異常則將使用默認的「Error」視圖模板。
推薦閱讀: