<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        ASP.NET MVC中異常處理&自定義錯誤頁詳析

        來源:懂視網 責編:小采 時間:2020-11-27 22:35:05
        文檔

        ASP.NET MVC中異常處理&自定義錯誤頁詳析

        ASP.NET MVC中異常處理&自定義錯誤頁詳析:一、應用場景 對于B/S應用程序,在部署到正式環境運行的過程中,很有可能出現一些在前期測試過程中沒有發現的一些異?;蛘咤e誤,或者說只有在特定條件滿足時才會發生的一些異常,對于使用ASP.NET MVC開發的應用程序站點,在部署到IIS上后,如果開發人員未對程序進
        推薦度:
        導讀ASP.NET MVC中異常處理&自定義錯誤頁詳析:一、應用場景 對于B/S應用程序,在部署到正式環境運行的過程中,很有可能出現一些在前期測試過程中沒有發現的一些異?;蛘咤e誤,或者說只有在特定條件滿足時才會發生的一些異常,對于使用ASP.NET MVC開發的應用程序站點,在部署到IIS上后,如果開發人員未對程序進

        一、應用場景

        對于B/S應用程序,在部署到正式環境運行的過程中,很有可能出現一些在前期測試過程中沒有發現的一些異常或者錯誤,或者說只有在特定條件滿足時才會發生的一些異常,對于使用ASP.NET MVC開發的應用程序站點,在部署到IIS上后,如果開發人員未對程序進行錯誤處理,那么一旦程序出現未處理的錯誤或異常,用戶將看到一個讓人感到及其困惑的錯誤堆棧跟蹤頁面,使得站點的用戶體驗下降,從程序的角度上來說,不做自定義錯誤處理也不利于程序出問題時的根源查找,因為很多時候有些錯誤只在特定條件下滿足時才重現,一旦錯過,可能就需要花大量時間去測試來重現問題,如果此時開發人員有對程序中的運行時異常進行日志記錄,那么或許將提供一些有價值的錯誤根源信息,下面我將向下大家講解如何實現自定義異常處理并跳轉到友好的錯誤提示頁面。

        二、異常處理&自定義錯誤頁

        1、通過異常過濾器 實現異常處理和自定義錯誤頁

        asp.net mvc 提供了 異常過濾器 的方式來實現當執行controller中某個action方法時拋出了未處理的異常時的捕捉,mvc中的異常過濾器是以特性(Attribute)的形式存在的,定義一個自定義異常過濾器只需要兩個步驟:

        1、定義一個類,繼承FilterAttribute類,并實現IExceptionFilter接口 2、應用自定義異常過濾器至指定的 action方法 或 controller類 或 全局應用。

        異常過濾器代碼

        using log4net;
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
        
        namespace Blog20180413.Filters
        {
         public class CustomExceptionFilterAttribute : FilterAttribute, IExceptionFilter
         {
         //log4net組件,用于日志記錄。
         static readonly ILog log = LogManager.GetLogger(typeof(CustomExceptionFilterAttribute));
         public void OnException(ExceptionContext filterContext)
         {
         //對捕獲到的異常信息進行日志記錄,方便開發人員排查問題。
         log.Error("應用程序異常", filterContext.Exception);
        
         //跳轉到自定義的錯誤頁,增強用戶體驗。
         ActionResult result = new ViewResult() { ViewName = "CustomErrorPage" };
         filterContext.Result = result;
         //異常處理結束后,一定要將ExceptionHandled設置為true,否則仍然會繼續拋出錯誤。
         filterContext.ExceptionHandled = true;
         }
         }
        }

        使用異常過濾器

        using Blog20180413.Filters;
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
        
        namespace Blog20180413.Controllers
        {
         public class TestExceptionHandleController : Controller
         {
         [CustomExceptionFilter]
         public ActionResult Index()
         {
         string str = string.Empty;
         //將拋出轉換異常
         int result = int.Parse(str);
         return View();
         }
         }
        }

        注意:

        第二個步驟中提到,可以將自定義異常過濾器 只應用到 action或者controller,如果只想將指定的異常過濾器以特性的形式應用到指定的一個或者多個controller或者action,而不想應用到所有的controller或者action,那么必須將該異常過濾器繼承FilterAttribute類,這是因為mvc框架是通過FilterAttributeFilterProvider.GetFilters來獲取標記在指定controller或者action上的異常過濾器特性的,而GetFilters內部邏輯要求必須繼承自FilterAttribute類。

        如果需要將自定義的異常過濾器應用到所有的controller的action上,那么需要將該自定義異常過濾器注冊到全局,代碼如下:

        using Blog20180413.Filters;
        using System.Web;
        using System.Web.Mvc;
        
        namespace Blog20180413
        {
         public class FilterConfig
         {
         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
         {
         filters.Add(new CustomExceptionFilterAttribute());
         }
         }
        }

        2、通過在Global.asax 中定義Application_Error方法 實現異常處理和自定義錯誤頁

        上面提到的 自定義異常過濾器只能捕獲在執行action方法過程中拋出的異常(即使注冊為全局過濾器也只能捕獲action方法執行過程中拋出的異常),如果需要捕獲更高級別的異常,也就是在請求執行過程中出現的任何異常(如在控制器的構造函數中拋出異常),那么可以使用該種方式,代碼如下:

        using log4net;
        using log4net.Config;
        using System;
        using System.Collections.Generic;
        using System.IO;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
        using System.Web.Routing;
        
        namespace Blog20180413
        {
         public class MvcApplication : System.Web.HttpApplication
         {
         static readonly ILog log = LogManager.GetLogger(typeof(MvcApplication));
         protected void Application_Start()
         {
         AreaRegistration.RegisterAllAreas();
         FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
         RouteConfig.RegisterRoutes(RouteTable.Routes);
         XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("~/web.config")));
         }
        
         protected void Application_Error(object sender, EventArgs e)
         {
         Exception exception = Server.GetLastError();
         //Server.ClearError();
         //這里記錄錯誤日志信息
         log.Error("MvcApplication 捕獲異常", exception);
         //跳轉到指定的自定義錯誤頁
         Response.Redirect("/CustomErrorHandle/CustomErrorPage");
         }
         }
        }

        3、通過配置system.web->customErrors節點 實現自定義錯誤頁

        當你的站點發生異常時,如果你只是想簡單的跳轉到一個自定義錯誤頁面,而不是對異常進一步處理時,那么你可以簡單的作如下配置操作即可:

        需要在web.config中做如下配置:

         <system.web>
         <customErrors mode="On" defaultRedirect="CustomErrorPage">
         </customErrors>
         </system.web>

        注意:這里的CustomErrorPage是一個視圖文件,放在Shared共享目錄下。

        如果你注冊了HandleErrorAttribute異常過濾器到全局,那么在你的錯誤頁中將能獲取到和異常相關的一些信息。但此時配置到defaultRedirect的值的必須是Error

        也就是自定義錯誤視圖頁面的名稱必須為Error.cshtml,并且放在Shared目錄,當然,你也可以通過在創建HandleErrorAttribute全局過濾器的過程中,設置器View屬性,這樣你就可以不用講錯誤視圖的名稱設置為Error了.如下:

         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
         {
         HandleErrorAttribute errorAttribute = new HandleErrorAttribute();
         errorAttribute.View = "CustomErrorPage";
         filters.Add(errorAttribute);
         }

        注冊HandleErrorAttribute(使用默認的錯誤視圖頁面文件名)

        public class FilterConfig
         {
         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
         {
         filters.Add(new HandleErrorAttribute());
         }
         }

        定義Error.cshtml視圖頁

        @{
         Layout = null;
        }
        @model HandleErrorInfo
        <!DOCTYPE html>
        <html>
        <head>
         <meta name="viewport" content="width=device-width" />
         <title>Error</title>
        </head>
        <body>
         <div>
         @*通過HandleErrorAttribute異常過濾器捕獲到的異常信息存儲在Model屬性中*@
         @Model.Exception.Message
         </div>
        </body>
        </html>

        之所以通過注冊HandleErrorAttribute過濾器捕獲的異常在錯誤頁中能獲取異常信息可以看HandleErrorAttribute類的內部實現,發現加載錯誤視圖頁面的過程中,傳遞了一個HandleErrorInfo對象過去。

        public virtual void OnException(ExceptionContext filterContext)
        {
         if (filterContext == null)
         {
         throw new ArgumentNullException("filterContext");
         }
         if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
         {
         Exception innerException = filterContext.Exception;
         if ((new HttpException(null, innerException).GetHttpCode() == 500) && this.ExceptionType.IsInstanceOfType(innerException))
         {
         string controllerName = (string) filterContext.RouteData.Values["controller"];
         string actionName = (string) filterContext.RouteData.Values["action"];
         HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
         ViewResult result = new ViewResult {
         ViewName = this.View,
         MasterName = this.Master,
         ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
         TempData = filterContext.Controller.TempData
         };
         filterContext.Result = result;
         filterContext.ExceptionHandled = true;
         filterContext.HttpContext.Response.Clear();
         filterContext.HttpContext.Response.StatusCode = 500;
         filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
         }
         }
        }
        public string View
        {
         get
         {
         if (string.IsNullOrEmpty(this._view))
         {
         return "Error";
         }
         return this._view;
         }
         set => 
         (this._view = value);
        }

        三、總結

        總的來說,Application_Error方法用于處理針對請求管道級別的發生的異常錯誤,而Mvc異常過濾器則只能處理在執行action方法過程中出現的異常.能處理的范圍相對Application_Error較小,但在實際項目開發中,用Mvc異常過濾器處理異常相對會多一點,因為我們的功能業務往往體現在控制器的action方法執行的過程中,也就是在這個過程中較容易產生異常。故開發中用Mvc異常過濾器就能適應大部分的異常處理需求。

        好了,

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        ASP.NET MVC中異常處理&自定義錯誤頁詳析

        ASP.NET MVC中異常處理&自定義錯誤頁詳析:一、應用場景 對于B/S應用程序,在部署到正式環境運行的過程中,很有可能出現一些在前期測試過程中沒有發現的一些異?;蛘咤e誤,或者說只有在特定條件滿足時才會發生的一些異常,對于使用ASP.NET MVC開發的應用程序站點,在部署到IIS上后,如果開發人員未對程序進
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 综合亚洲伊人午夜网 | 亚洲高清一区二区三区电影 | 99在线视频免费观看| 久久精品国产亚洲Aⅴ蜜臀色欲 | 美女羞羞免费视频网站| 免费中文字幕在线观看| 麻豆91免费视频| 伊人久久精品亚洲午夜| 久久er国产精品免费观看2| 亚洲第一极品精品无码久久| 性xxxx视频免费播放直播| 国产精品亚洲а∨无码播放| 久久久99精品免费观看| 久久久久亚洲精品无码蜜桃| 久久精品无码一区二区三区免费| 67194在线午夜亚洲| 日本特黄a级高清免费大片| 日韩在线观看免费完整版视频| 一本色道久久88亚洲综合| a级成人毛片免费图片| 亚洲精品**中文毛片| 国产精品久久久久久久久久免费 | 永久免费AV无码国产网站| 亚洲国产精品无码久久| 在线观看亚洲精品福利片| 中文字幕免费观看| 456亚洲人成在线播放网站| 免费又黄又爽的视频| 久久久免费的精品| 亚洲人成色777777精品| 久久精品国产亚洲Aⅴ香蕉| 91香焦国产线观看看免费| 蜜臀亚洲AV无码精品国产午夜.| 奇米影视亚洲春色| 性做久久久久久免费观看| a级毛片免费观看在线| 亚洲日本国产乱码va在线观看| 亚洲成人国产精品| 中文字幕免费在线看线人| 一级人做人a爰免费视频| 亚洲国产综合自在线另类|