上篇对了行为过滤器的使用作了讲解,若是在控制器行为的执行中遇到了异常怎么办呢?不要紧,还好框架给咱们提供了异常过滤器,在本篇中将会对异常过滤器的使用作一个大概的讲解。html
过滤器在系统框架中的总体对象模型web
IAuthorizationFilter受权认证过滤器的执行过程编程
使用IAuthorizationFilter过滤器c#
IActionFilter行为过滤器的执行过程服务器
自定义实现IActionFilter行为过滤器框架
异常过滤器的使用ide
在使用异常过滤器以前,咱们要看一下它们的结构:布局
public interface IExceptionFilter { void OnException(ExceptionContext filterContext); }
IExceptionFilter接口类型是异常过滤器必须实现的接口,固然了还有FilterAttribute特性类型这是必需要实现的。在此不对FilterAttribute特性类型作什么介绍。this
咱们看一下IExceptionFilter接口类型中的OnException()方法中的有个ExceptionContext类型的参数,ExceptionContext类型是遗产过滤器参数上下文对象,继承自ControllerContext类型,这种编程模式在MVC框架中随处可见了不作多的解释了。spa
在MVC框架中给咱们默认的提供了一个异常过滤器类型:
代码1-1
public class HandleErrorAttribute : FilterAttribute, IExceptionFilter { // 摘要: // 初始化 System.Web.Mvc.HandleErrorAttribute 类的新实例。 public HandleErrorAttribute(); public Type ExceptionType { get; set; } public string Master { get; set; } public string View { get; set; } public virtual void OnException(ExceptionContext filterContext); }
ExceptionType属性对应要处理的异常类型,若是设置某种异常类型值那么异常过滤器只会针对这个类型的异常来进行作处理,默认值是处理全部异常类型。
Master属性则是设置在处理异常以后所要显示视图所用的布局。
View属性是设置在处理异常以后所要显示的视图名称。
来看示例:
示例仍是接着上个篇幅的示例,没看过前篇的朋友也没什么影响很简单的示例。
代码1-2
public ActionResult Index() { int i = 0; int j = 3 / i; return View(_DataStandard.GetProducts()); }
首先咱们在控制器的Index()方法中定义个错误处理,0是不能做为除数的处理到这必须报异常的。运行的结果如图1所示。
图1
很明确的报出了异常的所在,这是咱们不但愿的看见的,接下来咱们把异常过滤器给使用上:
代码1-3
[HandleError] public ActionResult Index() { int i = 0; int j = 3 / i; return View(_DataStandard.GetProducts()); }
这时你会发现运行的结果和图1中所示的同样,这是坑爹呢??!!!!固然不是咱们须要在Web.config文件的中的<system.web>节点下作相对应的配置才能够,
代码1-4
<customErrors mode="On"" />
须要添加代码1-4中的内容到system.web节点下,这是咱们再来看一下运行的结果图。
图2
为何会显示这个页面,这跟HandleErrorAttribute类型中的OnException(ExceptionContext filterContext)方法默认实现有关系,它默认设置就是服务器错误信息,那咱们怎么自定义的指定咱们想显示的页面,或者是看到咱们想详细看到的错误信息呢?咱们再来重写一下OnException()方法吧。
代码1-5
public class MyCustomHandleErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } if (filterContext.Exception!=null) { Exception innerException = filterContext.Exception; if (!filterContext.ExceptionHandled) { 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 = "Error", MasterName = this.Master, ViewData = new ViewDataDictionary<HandleErrorInfo>(model), TempData = filterContext.Controller.TempData }; filterContext.Result = result; filterContext.ExceptionHandled = true; } } } }
在上面的MyCustomHandleErrorAttribute类型实现中,咱们只须要关注ExceptionContext filterContext参数中的Result的设置,在代码1-5中咱们指定了Error这个视图,而且还实例化了HandleErrorInfo类型做为视图模型传递到视图中,咱们如今要新建一个视图,在当前控制器的文件夹下View/[controllername]/Error.cshtml新建这个视图文件,而且选择为强类型视图,类型则为HandleErrorInfo类型,咱们看一下视图的定义。
代码1-6:
@model HandleErrorInfo @{ ViewBag.Title = "Error"; } <h2> Error</h2> <p> 异常类型:<b>@Model.Exception.GetType().Name</b> 异常所在控制器:<b>@Model.ControllerName</b> 异常所在控制器行为:<b>@Model.ActionName</b> </p> <p> 详细信息:<b>@Model.Exception.Message</b> </p>
如今咱们修改一下代码1-3中的所使用的过滤器,修改成咱们代码1-5中定义的自定义类型,再看一下运行结果:
到这里异常过滤器的基础使用也就讲解完毕了。还有一种结果过滤器就不作讲解了,基础结构和行为过滤器近乎相同使用方式也是,使用一下便知其用法。