MVC源码分析 - Error过滤器
接 上一篇 内容, 这里先看一下错误处理过滤器.
在看此部分之前, 先看看MVC已经提供的功能吧.
一. MVC 自带功能
1. 配置方法
<system.web>
<!--mode : Off / On / RemoteOnly-->
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="~/NotFound/Index"/>
</customErrors>
</system.web>
这里的mode默认是 Off , 就是会在页面中直接显示详细的错误信息.
如果是 On, 则不会显示详细的错误信息, 显示是这样的:

在没有配置具体 status 的跳转页面的时候, 显示是这样的:

如果在下面配置了错误状态对应的跳转页面, 会跳转到我们事先指定的页面:

这里的mode其实还有一个值:RemoteOnly. 这里的意思是在服务器端显示详细错误信息, 在客户端显示指定的页面. 还是很好用的.
2. 在方法上加特性的方法
在这里首先要介绍一下, 此特性的几个参数.

从上图中能看到4个参数, 看一下每一个参数是干啥的.
| 参数 | 描述 |
| ExceptionType | 要处理的异常类型 |
| Master | 模板视图的名称, 存放在 Views/Shared 文件下 |
| View | 内容视图名称, 也是存放在 Views/Shared 文件中 |
| Order | 过滤器被应用的顺序, 越小越靠前, 最高级别为-1, 默认为-1 |
[HandleError(ExceptionType = typeof(Exception), View = "Error500", Master = "_Layout1")]
public ActionResult Index()
{
throw new Exception("Home/Index 主动抛出的异常");
}

二. 自定义过滤器
1. Controller 控制器中, 自定义 OnException 方法
在HomeController中, 加入如下两个方法:
public ActionResult Index()
{
throw new Exception("Home/Index 主动抛出的异常");
} protected override void OnException(ExceptionContext filterContext)
{
filterContext.HttpContext.Response.Redirect("~/Errors/MyError?msg=" + filterContext.Exception.Message);
}
然后创建一个错误处理控制器 ErrorsController, 加入如下方法:
public ActionResult MyError(string msg)
{
ViewBag.Msg = msg;
return View();
}
到这里, 准备工作就差不多了, 视图部分我就不贴了, 直接上结果:

这种方式, 跟之前的权限过滤器一样, 只对本控制器内的方法起作用.
那是不是也像之前的那样, 有一个全局的呢? Of course, yes.
2. 自定义全局/局部错误过滤器
新建一个自定义过滤器MyErrorsAttribute
public class MyErrorsAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
//标记此错误已经处理过, 如果别的错误捕捉器捕捉到此错误, 就不会重复处理了.
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Redirect("~/Errors/MyError?msg=" + filterContext.Exception.Message);
}
}
接下来就是全局和局部的区分了.
1). 全局方式:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyErrorsAttribute());
}
}
2). 局部方式 - 特性的方式
[MyErrors]
public ActionResult Index()
{
throw new Exception("Foot/Index 主动抛出的异常");
}
在错误处理里面, 可以使用log4来记录错误, 然后将友好的错误页面展现给用户, 目的就达到了.
MVC源码分析 - Error过滤器的更多相关文章
- 精尽Spring MVC源码分析 - 寻找遗失的 web.xml
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- asp.net mvc源码分析-ModelValidatorProviders 客户端的验证
几年写过asp.net mvc源码分析-ModelValidatorProviders 当时主要是考虑mvc的流程对,客户端的验证也只是简单的提及了一下,现在我们来仔细看一下客户端的验证. 如图所示, ...
- ASP.NET MVC 源码分析(一)
ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 ...
- 精尽Spring MVC源码分析 - MultipartResolver 组件
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - HandlerExceptionResolver 组件
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- 精尽Spring MVC源码分析 - ViewResolver 组件
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- WebForm / MVC 源码分析
ASP.NET WebForm / MVC 源码分析 浏览器 Url:https//localhost:6565/Home/Index ,https//localhost:6565/WebForm ...
随机推荐
- virtualbox centos 连接网络
一.设置网络 设置 -> 网络 -> 连接方式:桥接网卡.设置当前连网络的界面名称.接入网线打勾 二.开启eth0 vi /etc/sysconfig/network-scripts/if ...
- uva12298(生成函数)
生成函数的一般应用: #include<iostream> #include<cstring> #include<cmath> #include<cstdio ...
- 卷积神经网络(CNN)之一维卷积、二维卷积、三维卷积详解
作者:szx_spark 由于计算机视觉的大红大紫,二维卷积的用处范围最广.因此本文首先介绍二维卷积,之后再介绍一维卷积与三维卷积的具体流程,并描述其各自的具体应用. 1. 二维卷积 图中的输入的数据 ...
- hdu 2191 【背包问题】
题目 请输出能够购买大米的最多重量,注意是重量不是价值. 把每一种物品拧出来,用01背包解决. #include <cstdio> #include <iostream> #i ...
- jvm虚拟机--堆内存
reserved 保留区域 堆 所有对象实例都在这里分配内存. 是垃圾收集的主要区域("GC 堆").现代的垃圾收集器基本都是采用分代收集算法,主要思想是针对不同的对象采取不同的垃 ...
- Redis中在程序中的应用
1.导入redis的配置文件,因为要交给web容器管理,所以直接命名为ApplicationContext-redis.xml,具体配置如下: <beans xmlns="http:/ ...
- ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听.请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpR ...
- 【转】javascript深入理解js闭包
原文:http://www.jb51.net/article/24101.htm 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作 ...
- 【转】基于Token的WEB后台认证机制
原谅地址:http://www.cnblogs.com/xiekeli/p/5607107.html 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每 ...
- MariaDB MyCat实现读写分离(15)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...