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来记录错误, 然后将友好的错误页面展现给用户, 目的就达到了.

目录已同步

时间: 2024-12-29 04:30:06

MVC源码分析 - Error过滤器的相关文章

asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证

原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetParameterValue方法中有这么一句代码: ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = (parameterDescriptor.BindingInfo.Prefix

ASP.NET MVC 源码分析(一)

ASP.NET MVC 源码分析(一) 直接上图: 我们先来看Core的设计: 从项目结构来看,asp.net.mvc.core有以下目录: ActionConstraints:action限制相关 AntiForgery:防伪相关 ActionResults:action返回对象相关 ApiExplorer:API描述和元数据相关接口 ApplicationModels:应用程序模型相关,应该是全局的model Areas:地区标签 Filters:大名鼎鼎的过滤器组件 Formatters:

asp.net mvc源码分析-ModelValidatorProviders 客户端的验证

几年写过asp.net mvc源码分析-ModelValidatorProviders 当时主要是考虑mvc的流程对,客户端的验证也只是简单的提及了一下,现在我们来仔细看一下客户端的验证. 如图所示, 首先我们要知道这里的data-val这些属性是在哪里生成的?可以肯定是在mvc后台生成的, @Html.PasswordFor(m => m.Password) 生成input @Html.ValidationMessageFor(m => m.Password) 生成span 调用层级关系:

WebForm / MVC 源码分析

ASP.NET WebForm / MVC 源码分析 浏览器 Url:https//localhost:6565/Home/Index ,https//localhost:6565/WebForm1.aspx,请求服务器(构建请求报文,并且将请求报文发送给服务器) 1:服务器(内核模式 Http.sys)对请求报文做基本的处理 2:请求服务器(用户模式,IIS服务器) 2.1:对发送过来的数据做一个检查,如果请求的是静态资源的(.html,jpg,js),那么IIS直接将这些资源返回浏览器 2.

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

MVC源码分析 - ModelBinder绑定 / 自定义数据绑定

这几天老感觉不对, 总觉得少点什么, 今天才发现, 前面 3 里面, 在获取Action参数信息的时候,  少解析了. 里面还有一个比较重要的东西. 今天看也是一样的. 在 InvokeAction() 方法里面, 有一句代码: IDictionary<string, object> parameterValues = this.GetParameterValues(controllerContext, actionDescriptor); 这个是用来获取参数的. 那么参数是不是随便获取呢?

Spring MVC源码分析--视图解析过程

写在最前,本文中的源码是4.2.3版本的源码,针对的是JstlView. 视图解析的过程即DispatcherServlet的doDispatch()方法的调用的processDispatchResult(): 1,processDispatchResult()里,调用DispatchServlet的render()方法: 2,render()方法里,调用DispatchServlet的resolveViewName()方法,把配置文件里注册的全部ViewResolver对象添加进来,寻找合适的

MVC源码分析 - Action/Result 过滤器(续)

上一篇 看到了Action/Result过滤器的执行顺序: OnActionExecuting -> Action -> OnActionExecuted -> OnResultExecuting -> View-> OnResultExecuted 这一篇就来做几个例子吧. 一.Demo 上一篇 的代码可能并不怎么好懂. 首先, 我能在FilterConfig中注册过滤器, 可以在Controller中重写Action/Result过滤器或者是在Controller上标注过

asp.net MVC 源码分析

先上一张图吧 asp.net请求机制的图  by传智播客邹华栋老师 然后是 邹老师添加MVC请求过程的图 其实MVC 实在.netframework上加了一个过滤器  HttpModule 在C:\Windows\Microsoft.NET\Framework\v4.0.30319 下的配置文件里加入的  <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" /&