ASP.NET MVC自定義異常過濾器
一、異常過濾器
異常篩選器用于實(shí)現(xiàn)IExceptionFilter接口,并在ASP.NET MVC管道執(zhí)行期間引發(fā)了未處理的異常時(shí)執(zhí)行。異常篩選器可用于執(zhí)行諸如日志記錄或顯示錯(cuò)誤頁(yè)之類的任務(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è)置用于顯示異常信息的頁(yè)視圖。
//
// 返回結(jié)果:
// 頁(yè)視圖。
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-01
sqlserver 刪除重復(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-01
asp.net下檢測(cè)遠(yuǎn)程URL是否存在的三種方法
檢測(cè)遠(yuǎn)程URL是否存在的三種方法,需要的朋友可以參考下。2009-12-12
asp.net頁(yè)面與頁(yè)面之間傳參數(shù)值方法(post傳值和get傳值)
這篇文章主要介紹了asp.net頁(yè)面與頁(yè)面之間傳參數(shù)值方法,說明了post傳值和get傳值的使用方法,需要的朋友可以參考下2014-02-02
datagrid行內(nèi)按鈕(更新/刪除等)操作實(shí)現(xiàn)代碼
datagrid控件想必大家很是熟悉,本文將介紹下datagrid行內(nèi)按鈕的操作更新/刪除等等,感興趣的你可不要錯(cuò)過了哈,希望本文知識(shí)點(diǎn)可以幫助到你2013-02-02
c# 讀取Northwind數(shù)據(jù)庫(kù)image字段
我在寫一個(gè)三層結(jié)構(gòu)Demo時(shí),使用了Northwind這個(gè)范例數(shù)據(jù)庫(kù)。但是奇怪的是,讀取Categories表的Picture列(image類型)無法在image控件中正常顯示(解決方案在后面代碼中可以看到)。2009-03-03
基于.Net實(shí)現(xiàn)前端對(duì)話框和消息框
這篇文章主要介紹了基于.Net實(shí)現(xiàn)前端對(duì)話框和消息框的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
ASP.NET MVC使用RazorEngine解析模板生成靜態(tài)頁(yè)
這篇文章主要介紹了ASP.NET MVC使用RazorEngine解析模板生成靜態(tài)頁(yè)的相關(guān)資料,需要的朋友可以參考下2016-05-05

