重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大概的讲解。
创新互联-专业网站定制、快速模板网站建设、高性价比珙县网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式珙县网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖珙县地区。费用合理售后完善,十余年实体公司更值得信赖。过滤器在系统框架中的整体对象模型
IAuthorizationFilter授权认证过滤器的执行过程
使用IAuthorizationFilter过滤器
IActionFilter行为过滤器的执行过程
自定义实现IActionFilter行为过滤器
异常过滤器的使用
在使用异常过滤器之前,我们要看一下它们的结构:
public interface IExceptionFilter { void OnException(ExceptionContext filterContext); }
IExceptionFilter接口类型是异常过滤器必须实现的接口,当然了还有FilterAttribute特性类型这是必须要实现的。在此不对FilterAttribute特性类型做什么介绍。
我们看一下IExceptionFilter接口类型中的OnException()方法中的有个ExceptionContext类型的参数,ExceptionContext类型是遗产过滤器参数上下文对象,继承自ControllerContext类型,这种编程模式在MVC框架中随处可见了不做多的解释了。
在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文件的中的
代码1-4
需要添加代码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(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"; }Error
异常类型:@Model.Exception.GetType().Name 异常所在控制器:@Model.ControllerName 异常所在控制器行为:@Model.ActionName
详细信息:@Model.Exception.Message
现在我们修改一下代码1-3中的所使用的过滤器,修改为我们代码1-5中定义的自定义类型,再看一下运行结果:
到这里异常过滤器的基础使用也就讲解完毕了。还有一种结果过滤器就不做讲解了,基础结构和行为过滤器近乎相同使用方式也是,使用一下便知其用法。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。