摘自: http://www.myexception.cn/web/1130191.html
asp.net mvc 3 配置全局異常處理 Web.config中設置CustomError Web.config中設置CustomError CustomError定義自動處理異常的行為,如下所示: <system.web> <!--<customErrors mode="RemoteOnly" defaultRedirect="~/error.html"/>--> <customErrors mode="On" defaultRedirect="~/error.html"/> <!--<customErrors mode="Off" defaultRedirect="~/error.html"/>--> </system.web> Mode的值可以是Off、On、RemoteOnly,不同的值定義研發階段或產品發布后的行為。 Mode值的使用場景: On:開啟自定義錯誤處理。 Off:關閉自定義錯誤處理,當發生異常時,就會看到ASP.NET的黃頁信息。 RemoteOnly:如果在服務器上運行程序(http://localhost),當發生異常時,不會看到自定義異常信息,如果通過其他機器訪問該程序,會看到自定義異常信息。該選項常用於開發人員調試程序,如果出現異常,開發人員可以通過本地訪問來查看異常詳細信息,而遠程訪問的用戶看到的是自定義的異常。 注意: 如果使用了HandleError特性,並且啟用了CustomError,當有未處理的異常發生時,MVC在被執行的HttpRequest的上下文中查找”Error”視圖(當前Controler對應的View文件夾中或Shared文件夾中),並呈現給用戶。在這種情況下,CustomError的”defaultRedirect”和”redirect”屬性會失效。注意:如果找不到Error視圖,會使用”defaultRedirect”和”redirect”的定向。 如果沒有使用HandleError,並且啟用了CustomError,當有未處理的異常發生時,會重定向到”defaultRedirect”和”redirect”屬性指定的url,如上例的/Error/ Unknown 提示:ASP.N.NET MVC3中,默認對所有的Controller注冊全局HandleError,因此不用擔心應用程序中的Controller沒有使用HandleError。在之前版本中沒有全局過濾器,HandleError必須對每個action或controller手工定義。 查看 Global.cs 文件下的 RegisterGlobalFilters 按照下面的方法注釋掉全局異常注冊,再有異常就會按照 web.config 中指定的頁面跳轉了 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); } 在web.config的CustomError中,也可以設置當異常出現重新定向到一個靜態頁面,如下: <customErrors mode="On" defaultRedirect="Custom404.htm"> </customErrors> 注意:靜態頁面需要放到web網站根目錄下,否則無法定向到。 異常處理時執行其他功能的方法: 1、重寫Controller的OnException方法 如果我們不僅僅在出現異常時顯示自定義的錯誤頁面,需要記錄錯誤日志,那么可以通過繼承Controller類並重些OnException方法實現。如果我們MVC程序的所有Controller都需要記錄日志,可以創建一個BaseController,重寫OnExcetion方法,然后其他需要記錄日志的Controller繼承BaseController即可。例如: public class BaseController : Controller { protected override void OnException(ExceptionContext filterContext) { // 此處進行異常記錄,可以記錄到數據庫或文本,也可以使用其他日志記錄組件。 // 通過filterContext.Exception來獲取這個異常。 string filePath = @"D:\Temp\Exceptions.txt"; StreamWriter sw = System.IO.File.AppendText(filePath); sw.Write(filterContext.Exception.Message); sw.Close(); // 執行基類中的OnException base.OnException(filterContext); } } 那么其他繼承自BaseController的Controller就會實現記錄錯誤日志的功能。 2、創建FilterAttribute 通過FilterAttribute,並把它添加到全局過濾器集合中就可以提供給整個應用程序使用,如果只需要在某幾個Action中使用,可以在Controller的Action中添加此特性。 Filter定義如下: public class LogExceptionFilterAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { // 添加記錄日志代碼 } } 如果要應用給所有的Controller的所有Action,在Global.asax.cs中實現下面代碼即可: public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LogExceptionFilterAttribute()); filters.Add(new HandleErrorAttribute()); } 或者給只需要使用此特性的Controller或Action添加 : [LogExceptionFilter()] public ActionResult About() { throw new Exception("出錯."); }