ASP.NET MVC自定義異常過濾器
一、異常過濾器
異常篩選器用于實現(xiàn)IExceptionFilter接口,并在ASP.NET MVC管道執(zhí)行期間引發(fā)了未處理的異常時執(zhí)行。異常篩選器可用于執(zhí)行諸如日志記錄或顯示錯誤頁之類的任務。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();
//
// 摘要:
// 獲取或設置異常的類型。
//
// 返回結(jié)果:
// 異常的類型。
public Type ExceptionType { get; set; }
//
// 摘要:
// 獲取或設置用于顯示異常信息的母版視圖。
//
// 返回結(jié)果:
// 母版視圖。
public string Master { get; set; }
//
// 摘要:
// 獲取此特性的唯一標識符。
//
// 返回結(jié)果:
// 此特性的唯一標識符。
public override object TypeId { get; }
//
// 摘要:
// 獲取或設置用于顯示異常信息的頁視圖。
//
// 返回結(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
{
/// <summary>
/// 異常過濾器
/// </summary>
public class ExceptionFilters : HandleErrorAttribute
{
/// <summary>
/// 在異常發(fā)生時調(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();
// 定義一個HandleErrorInfo,用于Error視圖展示異常信息
HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName);
ViewResult result = new ViewResult
{
ViewName = this.View,
// 定義ViewData,泛型
ViewData = new ViewDataDictionary<HandleErrorInfo>(info)
};
// 設置操作結(jié)果
filterContext.Result = result;
// 設置已經(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
/// <summary>
/// View表示發(fā)生異常時指定的視圖
/// 這里表示發(fā)生異常時使用ExceptionDetails視圖
/// </summary>
/// <returns></returns>
[ExceptionFilters(View =("ExceptionDetails"))]
public ActionResult Index()
{
// 測試拋出異常
throw new NullReferenceException("測試拋出的異常");
}
}
}異常發(fā)生時使用ExceptionDetails視圖,所以在Shared文件夾里面新建ExceptionDetails視圖,代碼如下:
<!--使用強類型視圖-->
@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>
拋錯控制器:<b>@Model.ControllerName</b> 拋錯方法:<b>@Model.ActionName</b> 拋錯類型:<b>
@Model.Exception.GetType().Name
</b>
</p>
<p>
異常信息:<b>@Model.Exception.Message</b>
</p>
<p>
堆棧信息:
</p>
<pre>@Model.Exception.StackTrace</pre>
</body>
</html>三、測試
運行程序,訪問Exception控制器的Index方法,效果如下:

四、總結(jié)
上面的案例演示了一個自定義異常類,很明顯比HandleError要靈活,在自定義異常類里面可以寫很多與業(yè)務相關的代碼。
GitHub代碼地址:https://github.com/jxl1024/CustomerHandleErrorFilter
到此這篇關于ASP.NET MVC自定義異常過濾器的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
.NET下文本相似度算法余弦定理和SimHash淺析及應用實例分析
這篇文章主要介紹了.NET下文本相似度算法余弦定理和SimHash淺析及應用,實例形式詳細講述了相似度算法余弦定理和SimHash的原理與用法,需要的朋友可以參考下2015-01-01
.Net使用SuperSocket框架實現(xiàn)WebSocket后端
這篇文章介紹了.Net使用SuperSocket框架實現(xiàn)WebSocket后端,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-01-01
asp.net頁面與頁面之間傳參數(shù)值方法(post傳值和get傳值)
這篇文章主要介紹了asp.net頁面與頁面之間傳參數(shù)值方法,說明了post傳值和get傳值的使用方法,需要的朋友可以參考下2014-02-02
datagrid行內(nèi)按鈕(更新/刪除等)操作實現(xiàn)代碼
datagrid控件想必大家很是熟悉,本文將介紹下datagrid行內(nèi)按鈕的操作更新/刪除等等,感興趣的你可不要錯過了哈,希望本文知識點可以幫助到你2013-02-02
c# 讀取Northwind數(shù)據(jù)庫image字段
我在寫一個三層結(jié)構(gòu)Demo時,使用了Northwind這個范例數(shù)據(jù)庫。但是奇怪的是,讀取Categories表的Picture列(image類型)無法在image控件中正常顯示(解決方案在后面代碼中可以看到)。2009-03-03
ASP.NET MVC使用RazorEngine解析模板生成靜態(tài)頁
這篇文章主要介紹了ASP.NET MVC使用RazorEngine解析模板生成靜態(tài)頁的相關資料,需要的朋友可以參考下2016-05-05

