ASP.NET MVC自定義異常過濾器
一、異常過濾器
異常篩選器用于實(shí)現(xiàn)IExceptionFilter接口,并在ASP.NET MVC管道執(zhí)行期間引發(fā)了未處理的異常時(shí)執(zhí)行。異常篩選器可用于執(zhí)行諸如日志記錄或顯示錯(cuò)誤頁之類的任務(wù)。HandleErrorAttribute類是異常篩選器的一個(gè)示例。
先來看看HandleErrorAttribute類的定義:
#region 程序集 System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 // D:\Practice\MVC\自定義異常過濾器\MVCCuetomerExcepFilter\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll #endregion namespace System.Web.Mvc { // // 摘要: // 表示一個(gè)特性,該特性用于處理由操作方法引發(fā)的異常。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class HandleErrorAttribute : FilterAttribute, IExceptionFilter { // // 摘要: // 初始化 System.Web.Mvc.HandleErrorAttribute 類的新實(shí)例。 public HandleErrorAttribute(); // // 摘要: // 獲取或設(shè)置異常的類型。 // // 返回結(jié)果: // 異常的類型。 public Type ExceptionType { get; set; } // // 摘要: // 獲取或設(shè)置用于顯示異常信息的母版視圖。 // // 返回結(jié)果: // 母版視圖。 public string Master { get; set; } // // 摘要: // 獲取此特性的唯一標(biāo)識(shí)符。 // // 返回結(jié)果: // 此特性的唯一標(biāo)識(shí)符。 public override object TypeId { get; } // // 摘要: // 獲取或設(shè)置用于顯示異常信息的頁視圖。 // // 返回結(jié)果: // 頁視圖。 public string View { get; set; } // // 摘要: // 在發(fā)生異常時(shí)調(diào)用。 // // 參數(shù): // filterContext: // 操作篩選器上下文。 // // 異常: // T:System.ArgumentNullException: // filterContext 參數(shù)為 null。 public virtual void OnException(ExceptionContext filterContext); } }
從代碼中可以看出HandleErrorAttribute繼承了IExceptionFilter接口,并且有一個(gè)虛方法,如果要自定義異常過濾器,只需要繼承HandleErrorAttribute類并重寫HandleErrorAttribute類里面的虛方法即可。
二、示例
1、創(chuàng)建異常類
新建一個(gè)ExceptionFilters類繼承自HandleErrorAttribute,并重寫OnException方法,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCuetomerExcepFilter.Extension { /// <summary> /// 異常過濾器 /// </summary> public class ExceptionFilters : HandleErrorAttribute { /// <summary> /// 在異常發(fā)生時(shí)調(diào)用 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { // 判斷是否已經(jīng)處理過異常 if(!filterContext.ExceptionHandled) { // 獲取出現(xiàn)異常的controller和action名稱,用于記錄 string strControllerName = filterContext.RouteData.Values["controller"].ToString(); string strActionName = filterContext.RouteData.Values["action"].ToString(); // 定義一個(gè)HandleErrorInfo,用于Error視圖展示異常信息 HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName); ViewResult result = new ViewResult { ViewName = this.View, // 定義ViewData,泛型 ViewData = new ViewDataDictionary<HandleErrorInfo>(info) }; // 設(shè)置操作結(jié)果 filterContext.Result = result; // 設(shè)置已經(jīng)處理過異常 filterContext.ExceptionHandled = true; } //base.OnException(filterContext); } } }
2、創(chuàng)建控制器
新建一個(gè)控制器,代碼如下:
using MVCCuetomerExcepFilter.Extension; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCuetomerExcepFilter.Controllers { public class ExceptionController : Controller { // GET: Exception /// <summary> /// View表示發(fā)生異常時(shí)指定的視圖 /// 這里表示發(fā)生異常時(shí)使用ExceptionDetails視圖 /// </summary> /// <returns></returns> [ExceptionFilters(View =("ExceptionDetails"))] public ActionResult Index() { // 測(cè)試拋出異常 throw new NullReferenceException("測(cè)試拋出的異常"); } } }
異常發(fā)生時(shí)使用ExceptionDetails視圖,所以在Shared文件夾里面新建ExceptionDetails視圖,代碼如下:
<!--使用強(qiáng)類型視圖--> @model System.Web.Mvc.HandleErrorInfo @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>異常</title> </head> <body> <p> 拋錯(cuò)控制器:<b>@Model.ControllerName</b> 拋錯(cuò)方法:<b>@Model.ActionName</b> 拋錯(cuò)類型:<b> @Model.Exception.GetType().Name </b> </p> <p> 異常信息:<b>@Model.Exception.Message</b> </p> <p> 堆棧信息: </p> <pre>@Model.Exception.StackTrace</pre> </body> </html>
三、測(cè)試
運(yùn)行程序,訪問Exception控制器的Index方法,效果如下:
四、總結(jié)
上面的案例演示了一個(gè)自定義異常類,很明顯比HandleError要靈活,在自定義異常類里面可以寫很多與業(yè)務(wù)相關(guān)的代碼。
GitHub代碼地址:https://github.com/jxl1024/CustomerHandleErrorFilter
到此這篇關(guān)于ASP.NET MVC自定義異常過濾器的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET過濾器的應(yīng)用方法介紹
- asp.net?core?MVC?全局過濾器之ExceptionFilter過濾器(1)
- Asp.Net MVC學(xué)習(xí)總結(jié)之過濾器詳解
- asp.net core MVC 過濾器之ActionFilter過濾器(2)
- ASP.NET Core MVC 過濾器的使用方法介紹
- ASP.NET mvc4中的過濾器的使用
- ASP.NET Core MVC 過濾器(Filter)
- ASP.NET?MVC授權(quán)過濾器用法
- ASP.NET MVC異常過濾器用法
- ?ASP.NET Core 模型驗(yàn)證過濾器的兩種實(shí)現(xiàn)方法
相關(guān)文章
.NET下文本相似度算法余弦定理和SimHash淺析及應(yīng)用實(shí)例分析
這篇文章主要介紹了.NET下文本相似度算法余弦定理和SimHash淺析及應(yīng)用,實(shí)例形式詳細(xì)講述了相似度算法余弦定理和SimHash的原理與用法,需要的朋友可以參考下2015-01-01sqlserver 刪除重復(fù)記錄處理(轉(zhuǎn))
刪除重復(fù)記錄有大小關(guān)系時(shí),保留大或小其中一個(gè)記錄2011-07-07.Net使用SuperSocket框架實(shí)現(xiàn)WebSocket后端
這篇文章介紹了.Net使用SuperSocket框架實(shí)現(xiàn)WebSocket后端,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01asp.net下檢測(cè)遠(yuǎn)程URL是否存在的三種方法
檢測(cè)遠(yuǎn)程URL是否存在的三種方法,需要的朋友可以參考下。2009-12-12asp.net頁面與頁面之間傳參數(shù)值方法(post傳值和get傳值)
這篇文章主要介紹了asp.net頁面與頁面之間傳參數(shù)值方法,說明了post傳值和get傳值的使用方法,需要的朋友可以參考下2014-02-02datagrid行內(nèi)按鈕(更新/刪除等)操作實(shí)現(xiàn)代碼
datagrid控件想必大家很是熟悉,本文將介紹下datagrid行內(nèi)按鈕的操作更新/刪除等等,感興趣的你可不要錯(cuò)過了哈,希望本文知識(shí)點(diǎn)可以幫助到你2013-02-02c# 讀取Northwind數(shù)據(jù)庫image字段
我在寫一個(gè)三層結(jié)構(gòu)Demo時(shí),使用了Northwind這個(gè)范例數(shù)據(jù)庫。但是奇怪的是,讀取Categories表的Picture列(image類型)無法在image控件中正常顯示(解決方案在后面代碼中可以看到)。2009-03-03基于.Net實(shí)現(xiàn)前端對(duì)話框和消息框
這篇文章主要介紹了基于.Net實(shí)現(xiàn)前端對(duì)話框和消息框的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07ASP.NET MVC使用RazorEngine解析模板生成靜態(tài)頁
這篇文章主要介紹了ASP.NET MVC使用RazorEngine解析模板生成靜態(tài)頁的相關(guān)資料,需要的朋友可以參考下2016-05-05