1.配置文件:webConfig中配置經常出現的錯誤頁面:
<system.web>節點下添加 <customErrors>節點,在 <customErrors>節點下配置<error>錯誤信息,如下:
<system.web> <customErrors mode="On" defaultRedirect="~/Html_Tools/Html_UI/Error_404.htm"> <error statusCode="404" redirect="~/Html_Tools/Html_UI/Error_404.htm" /> <error statusCode="500" redirect="~/Html_Tools/Html_UI/Error_500.htm" /> </customErrors> <!--發布時改為false,開發時為true--> <compilation debug="true" targetFramework="4.6" /> <!--配置文件傳輸大小限制--> <httpRuntime maxRequestLength="51200" targetFramework="4.6" /> </system.web>
2.自定義異常處理錯誤頁面:
ASP.Net MVC3中如果配置文件出錯了,怎么跳轉到自定義的錯誤頁,現在參考網上的檔案是說
添加 如下配置文件,並且在路徑Views/Shared/下添加Error頁面,測試下沒有用的,請大家看看有什么好的建議啊,謝謝了啊!
<system.web>
<customErrors mode="On" defaultRedirect="/Base/Error/">
</customErrors>
</system.web>
MVC根本不會理睬web.config中的customErrors,默認是由HandleErrorAttribute處理的,顯示的是/Views/Shared/Error.cshtml中內容。
mvc中,可以用過濾器來實現異常處理
1.在Global.asax文件,
//1.在Global.asax文件中 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new ExceptionFilterAttribute()); //自己定義的過濾器 } /// <summary> /// 2.自己定義的過濾器 處理異常跳轉錯誤頁 /// 捕獲異常 跳轉到錯誤頁 /// </summary> public class ExceptionFilterAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { base.OnException(filterContext); string excepitonInfo = filterContext.Exception.ToString(); //LogHelper.OutputLog(excepitonInfo);//記錄日志 filterContext.HttpContext.Response.Redirect("~/Html_Tools/Html_UI/Error.htm"); } }
當ASP.NET MVC程序出現了異常,怎么處理更加規范?
1. 最簡單的方法是設置<customErrors/>節點
<customErrors>節點用 於定義一些自定義錯誤信息的信息。此節點有Mode和defaultRedirect兩個屬性,其中defaultRedirect屬性是一個可選屬性, 表示應用程序發生錯誤時重定向到的默認URL,如果沒有指定該屬性則顯示一般性錯誤。Mode屬性是一個必選屬性,它有三個可能值,它們所代表的意義分別 如下:
On 表示在本地和遠程用戶都會看到自定義錯誤信息。
Off 禁用自定義錯誤信息,本地和遠程用戶都會看到詳細的錯誤信息。
RemoteOnly 表示本地用戶將看到詳細錯誤信息,而遠程用戶將會看到自定義錯誤信息。
這里有必要說明一下本地用戶和遠程用戶的概念。當 我們訪問asp.net應用程時所使用的機器和發布asp.net應用程序所使用的機器為同一台機器時成為本地用戶,反之則稱之為遠程用戶。在開發調試階 段為了便於查找錯誤Mode屬性建議設置為Off,而在部署階段應將Mode屬性設置為On或者RemoteOnly,以避免這些詳細的錯誤信息暴露了程 序代碼細節從而引來黑客的入侵。
<error>子節點
在<customErrors>節點 下還包含有<error>子節點,這個節點主要是根據服務器的HTTP錯誤狀態代碼而重定向到我們自定義的錯誤頁面,注意要 使<error>子節點下的配置生效,必須將<customErrors>節點節點的Mode屬性設置為“On”。下面是一個例 子:
<customErrors mode="On" defaultRedirect="~/Html_Tools/Html_UI/Error_404.htm"> <error statusCode="404" redirect="~/Html_Tools/Html_UI/Error_404.htm" /> <error statusCode="500" redirect="~/Html_Tools/Html_UI/Error_500.htm" /> </customErrors>
在上面的配置中如果用戶訪問的頁面不存在就會跳轉到404.htm頁面,如果服務端的內部錯誤的頁面則會跳轉到500.htm頁面,500.htm和404.htm頁面都是我們自己添加的頁面,我們可以在頁面中給出友好的錯誤提示。
2. 使用過濾器HandleErrorAttribute
隨着ASP.NET MVC版本的更新,出現了HandleErrorAttribute,使用Filter以AOP的思想實現了針對於Action的異常處理。使用此 Filter后,當程序中出現異常的時候,會去封裝這些異常信息,然后路由自動轉到該Controller對應的Error.cshtml中,如果此路徑 下沒有改文件,則會到shared目錄中尋找此文件。另外一個相關的是在Global.asax中的protected void Application_Error(object sender, EventArgs e)方法,是捕捉異常的最后一道防線,也就是說,這是最高層次的異常捕獲處理邏輯。 使用HandleErrorAttribute后,找到了Error.cshtml,則此時異常已經被捕獲處理,所以不會再次被 Application_Error捕獲處理。此外,可以通過@model HandleErrorInfo 在Error.cshtml中定制顯示異常信息。有一點需要注意的是,HandleErrorAttribute是在customErrors基礎之上的,如果想使用HandleErrorAttribute,customErrors的Mode必須要設置為On或RemoteOnly. 否則,HandleErrorAttribute將不起作用。
3. 自定義顯示路徑
如果遇到異常后不單單是要自定義異常顯示,而且還 需要進行日志記錄。此時,可以通過繼承擴展HandleErrorAttribute來實現新的Filter,然后在lobal.ascx中對所有的 Action進行注冊,filters.Add(new MyHandleErrorAttribute()).在這里詳細說明一下另一種方式。我們可以寫一個專門的Controller和Action來進行異 常發生時的路由設置.
public class UtilityController : Controller { public ActionResult Error() { return View(); } public ActionResult PageNotFound() { return View(); } }
當出現異常的時候,把異常拋到最頂端,由Application_Error統一處理。這里的統一處理就包括,記錄日志,重新進行頁面定向等。
protected void Application_Error(object sender, EventArgs e) { var ex = Server.GetLastError(); Log.Error(ex); //記錄日志信息 var httpStatusCode = (ex is HttpException) ? (ex as HttpException).GetHttpCode() : 500; //這里僅僅區分兩種錯誤 var httpContext = ((MvcApplication)sender).Context; httpContext.ClearError(); httpContext.Response.Clear(); httpContext.Response.StatusCode = httpStatusCode; var shouldHandleException = true; HandleErrorInfo errorModel; var routeData = new RouteData(); routeData.Values["controller"] = "Utility"; switch (httpStatusCode) { case 404: routeData.Values["action"] = "PageNotFound"; errorModel = new HandleErrorInfo(new Exception(string.Format("No page Found", httpContext.Request.UrlReferrer), ex), "Utility", "PageNotFound"); break; default: routeData.Values["action"] = "Error"; Exception exceptionToReplace = null; //這里使用了EntLib的異常處理模塊的一些功能 shouldHandleException = ExceptionPolicy.HandleException(ex, "LogAndReplace", out exceptionToReplace); errorModel = new HandleErrorInfo(exceptionToReplace, "Utility", "Error"); break; } if (shouldHandleException) { var controller = new UtilityController(); controller.ViewData.Model = errorModel; //通過代碼路由到指定的路徑 ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData)); } }
原文參考引自:http://blog.csdn.net/zjlovety/article/details/48734791