網(wǎng)站首頁 編程語言 正文
一、異常過濾器
異常篩選器用于實現(xiàn)IExceptionFilter接口,并在ASP.NET MVC管道執(zhí)行期間引發(fā)了未處理的異常時執(zhí)行。異常篩選器可用于執(zhí)行諸如日志記錄或顯示錯誤頁之類的任務(wù)。HandleErrorAttribute類是異常篩選器的一個示例。
先來看看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 { // // 摘要: // 表示一個特性,該特性用于處理由操作方法引發(fā)的異常。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class HandleErrorAttribute : FilterAttribute, IExceptionFilter { // // 摘要: // 初始化 System.Web.Mvc.HandleErrorAttribute 類的新實例。 public HandleErrorAttribute(); // // 摘要: // 獲取或設(shè)置異常的類型。 // // 返回結(jié)果: // 異常的類型。 public Type ExceptionType { get; set; } // // 摘要: // 獲取或設(shè)置用于顯示異常信息的母版視圖。 // // 返回結(jié)果: // 母版視圖。 public string Master { get; set; } // // 摘要: // 獲取此特性的唯一標識符。 // // 返回結(jié)果: // 此特性的唯一標識符。 public override object TypeId { get; } // // 摘要: // 獲取或設(shè)置用于顯示異常信息的頁視圖。 // // 返回結(jié)果: // 頁視圖。 public string View { get; set; } // // 摘要: // 在發(fā)生異常時調(diào)用。 // // 參數(shù): // filterContext: // 操作篩選器上下文。 // // 異常: // T:System.ArgumentNullException: // filterContext 參數(shù)為 null。 public virtual void OnException(ExceptionContext filterContext); } }
從代碼中可以看出HandleErrorAttribute繼承了IExceptionFilter接口,并且有一個虛方法,如果要自定義異常過濾器,只需要繼承HandleErrorAttribute類并重寫HandleErrorAttribute類里面的虛方法即可。
二、示例
1、創(chuàng)建異常類
新建一個ExceptionFilters類繼承自HandleErrorAttribute,并重寫OnException方法,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCuetomerExcepFilter.Extension { ////// 異常過濾器 /// public class ExceptionFilters : HandleErrorAttribute { ////// 在異常發(fā)生時調(diào)用 /// /// 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(); // 定義一個HandleErrorInfo,用于Error視圖展示異常信息 HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName); ViewResult result = new ViewResult { ViewName = this.View, // 定義ViewData,泛型 ViewData = new ViewDataDictionary(info) }; // 設(shè)置操作結(jié)果 filterContext.Result = result; // 設(shè)置已經(jīng)處理過異常 filterContext.ExceptionHandled = true; } //base.OnException(filterContext); } } }
2、創(chuàng)建控制器
新建一個控制器,代碼如下:
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 ////// View表示發(fā)生異常時指定的視圖 /// 這里表示發(fā)生異常時使用ExceptionDetails視圖 /// ///[ExceptionFilters(View =("ExceptionDetails"))] public ActionResult Index() { // 測試拋出異常 throw new NullReferenceException("測試拋出的異常"); } } }
異常發(fā)生時使用ExceptionDetails視圖,所以在Shared文件夾里面新建ExceptionDetails視圖,代碼如下:
@model System.Web.Mvc.HandleErrorInfo @{ Layout = null; }異常 拋錯控制器:@Model.ControllerName 拋錯方法:@Model.ActionName 拋錯類型: @Model.Exception.GetType().Name
異常信息:@Model.Exception.Message
堆棧信息:
@Model.Exception.StackTrace
三、測試
運行程序,訪問Exception控制器的Index方法,效果如下:
四、總結(jié)
上面的案例演示了一個自定義異常類,很明顯比HandleError要靈活,在自定義異常類里面可以寫很多與業(yè)務(wù)相關(guān)的代碼。
GitHub代碼地址:https://github.com/jxl1024/CustomerHandleErrorFilter
原文鏈接:https://www.cnblogs.com/dotnet261010/p/10848078.html
相關(guān)推薦
- 2023-03-19 詳解OpenMP的線程同步機制_C 語言
- 2022-01-31 Nginx的平滑重啟和平滑升級
- 2022-12-06 詳解Python的整數(shù)是如何實現(xiàn)的_python
- 2022-05-27 android實現(xiàn)簡單拼圖游戲_Android
- 2022-07-27 C++中整形與浮點型如何在內(nèi)存中的存儲詳解_C 語言
- 2022-10-13 Windows命令批處理的用法詳解_DOS/BAT
- 2022-02-24 JDBC中在結(jié)果集中以列順序獲取值時注意類型匹配
- 2022-11-05 Android實現(xiàn)折線圖小工具_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支