ASP.NET MVC全局異常處理和捕獲的思路
這幾天稍微研究了下ASP.NET MVC的全局異常處理以及捕獲,相比ASP.NET Web Form,ASP.NET MVC的處理方式有所不同,以往是通過注冊Global.asax文件中的Application_Error事件進行全局異常捕獲,現在MVC可以使用強大的過濾器進行自定義錯誤的處理。本文作為學習筆記,將ASP.NET MVC中,我已知的幾種全局異常捕獲及處理的思路進行整理和對比分析。
此方法對于Web Form和MVC來說都是通用的,在ASP.NET中,只要網站程序拋出未捕獲的異常都會觸發Application_Error事件。我們在事件中通過Server.GetLastError()方法獲取Exception對象(可轉化成HttpException對象,以獲取相關的HTTP錯誤代碼)。
使用此方法一定要把GlobalFilter全局過濾器中的HandleErrorAttribute注冊取消掉,也可以將配置文件中的customErrors節點關閉,否則HTTP 500的錯誤將不會被Application_Error事件捕獲。
還要注意一點,如果想在事件中跳轉到自己定義的錯誤頁面,那么在響應輸出之前一定要記得調用 Server.ClearError()方法清除異常。否則會有下面兩種情況,如果自定義錯誤關閉,會顯示錯誤黃頁(即詳細異常信息頁面),如果沒關閉則會跳轉到自定義錯誤定義的頁面:
效果如下:
小結:這種方法有非常好的兼容性,可以在Web Form和MVC中通用。另外一點是SEO優化十分友好,我們可以對HTTP錯誤碼進行控制,畢竟customErrors是使用302跳轉,是十分不利于SEO的。此外要注意在MVC中Server.Transfer不支持路由!
從此的開發中,又跳過一個小坑!。越努力,越幸運!!!