異常處理跳轉頁面
第一步,在項目的Web.config文件中找到節點<system.web>
在此節點下添加配置(Error為定義的控制器也可以多添加些error標簽用於區分不同的錯誤)
<customErrors mode="On" defaultRedirect="~/Error/index"> <error statusCode="404" redirect="~/Error/Error404" /> </customErrors>
CustomErrors Mode的值可以是Off、On、RemoteOnly,不同的值定義研發階段或產品發布后的行為。
On:開啟自定義錯誤處理。
Off:關閉自定義錯誤處理,當發生異常時,就會看到ASP.NET的黃頁信息。
RemoteOnly:如果在服務器上運行程序(http://localhost),當發生異常時,不會看到自定義異常信息,如果通過其他機器訪問該程序,會看到自定義異常信息。該選項常用 於開發人員調試程序,如果出現異常,開發人員可以通過本地訪問來查看異常詳細信息,而遠程訪問的用戶看到的是自定義的異常。
第二步,針對404錯誤在頁面上設置狀態碼
第三步,在App_Start文件下找到FilterConfig文件打開之后注釋掉下圖代碼
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { // filters.Add(new HandleErrorAttribute()); }
注意點
如果控制器使用了[HandleError]特性,並且啟用了CustomError,當有未處理的異常發生時,MVC在被執行的HttpRequest的上下文中查找”Error”視圖(當前Controler對 應的View文件夾中或Shared文件夾中),並呈現給用戶。在這種情況下,CustomError的”defaultRedirect”和”redirect”屬性會失效。注意:如果找不到Error視圖,會使 用”defaultRedirect”和”redirect”的定向
如果控制器沒有使用[HandleError],並且啟用了CustomError,當有未處理的異常發生時,會重定向到”defaultRedirect”和”redirect”屬性指定的url,如上例的/Error/
提示:
ASP.N.NET MVC3以后中,默認對所有的Controller注冊全局HandleError,因此不用擔心應用程序中的Controller沒有使用HandleError。在之前版本中沒有全局過濾器,HandleError必須對每個action或controller手工定義。MVC3版本 Global.cs 文件下的 RegisterGlobalFilters,MVC4以后的在在App_Start文件下找到FilterConfig文件中
其他:
在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("出錯.");
}