概念介绍

异常过滤器主要在我们方法中出现异常的时候触发,一般我们用 异常过滤器 记录日志,或者在产生异常时做友好的处理

如果我们需要创建异常过滤器需要实现IExceptionFilter接口。

namespace System.Web.Mvc
{
//
// 摘要:
// 定义异常筛选器所需的方法。
public interface IExceptionFilter
{
//
// 摘要:
// 在发生异常时调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnException(ExceptionContext filterContext);
}
}

我们看到该接口里只有一个方法OnException,这个方法在在我们调用需要过滤的方法出现异常时触发。

OnException

我们已经知道了OnException方法是在动作方法抛出异常时被调用的那么我们就可以利用这个方法在这里对异常进行处理,比如记录日志,比如重定向在OnException方法中传递的参数是一个ExceptionContext对象,它继承于ControllerContext类,它的属性如下:

名称 类型 说明
Exception Exception 获取或设置异常对象。
ExceptionHandled bool 获取或设置一个值,该值指示是否已处理异常。。
Result ActionResult 获取或设置操作结果。

执行OnException方法

下面我将演示OnException方法,首先我们还是在之前的Filter文件夹下添加一个名为 ErrorExceptionFilterAttribute.cs 的过滤器类,我们继承 FilterAttribute 类和 IExceptionFilter 接口,为了方便演示,我们简单处理,我们会在调用的方法中抛出一个异常并记录我请求的json数据

这里我们直接引用log4net来实现记录日志的功能

这是我们在 ErrorExceptionFilterAttribute.cs 文件中编写的代码

 public class ErrorExceptionFilterAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
Stream inputStream = filterContext.HttpContext.Request.InputStream;
inputStream.Position = 0;
var contentEncoding= filterContext.HttpContext.Request.ContentEncoding;
var streamReader = new StreamReader(inputStream,contentEncoding);
var errorMsg = streamReader.ReadToEnd();
var logger = LogManager.GetLogger(typeof(ErrorExceptionFilterAttribute));
logger.Error(errorMsg);
var Url = new UrlHelper(filterContext.RequestContext);
var url = Url.Action("Login", "Account");
filterContext.Result = new RedirectResult(url);
}
}

在我们的动作方法抛出异常时我们在这里从接受的请求中取出json数据并保存到日志里,并把页面从新定向到登录页。

过滤器写好了接着我们去相应的方法里加上我们的异常过滤器,并且使该动作方法抛出异常

        [ErrorExceptionFilter]
public ActionResult Index()
{
throw new ArgumentNullException();
}

好了我们运行程序,并且在浏览器里直接请求我们这个方法,我们看看效果

咦,我们发现页面并没有重定向到登录页而且抛了黄页这是为什么呢?这是因为我们在异常过滤器中少了一步操作我们需要把它的ExceptionHandled属性设置为true,表示我们处理过这个异常了,这样我们就能得到应用的效果了,接着我们把少的那句话加上

 public class ErrorExceptionFilterAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
Stream inputStream = filterContext.HttpContext.Request.InputStream;
inputStream.Position = 0;
var contentEncoding= filterContext.HttpContext.Request.ContentEncoding;
var streamReader = new StreamReader(inputStream,contentEncoding);
var errorMsg = streamReader.ReadToEnd();
var logger = LogManager.GetLogger(typeof(ErrorExceptionFilterAttribute));
logger.Error(errorMsg);
filterContext.ExceptionHandled = true;
var Url = new UrlHelper(filterContext.RequestContext);
var url = Url.Action("Login", "Account");
filterContext.Result = new RedirectResult(url);
}
}

我们再来看看



果然还是我们熟悉的那个登录页面

接着我们去模拟一条请求,向我们的抛异常的地址发送一条json数据接着我们去看看我们的日志

总结

异常过滤器个人感觉也是很重要,毕竟我们都会犯错而一个完善的日志系统或者一个良好的处理页面,都是对错误最好的补救措施,毕竟防范于未然,我们可以在Global中配置异常过滤器让其在全局都生效。

我们如果新建一个MVC的项目我们会发现在Global中有这么一句话FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 这个表示注册全局过滤器,GlobalFilters是全局过滤器的集合,也就是说我们所有的过滤器都能通过在GlobalFilters中Add来做到全局适配。

笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)的更多相关文章

  1. 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)

    过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...

  2. 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)

    授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...

  3. 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)

    概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...

  4. 笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)

    概念介绍 结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行. 如果我们需要创建结果过滤器需要实现IResultFilter接口. namespa ...

  5. 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)

    概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...

  6. 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)

    概念介绍 动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行. 如果我们需要创建动作过滤器需要实现IActionFilter接口. 我们看到该接口里有两 ...

  7. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. 201521123064 《Java程序设计》第9周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次作业题集异常 Q1:常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...

  2. 201521123011《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. MySql数据库简单操作 1.启动与退出(quit或exit ) 操作 显示所有数据库: show databa ...

  3. pygame 弹力球及其变速的实现

    期望: 1.球体接触到框体后反弹 2.设置速度按键,按下后改变球体速度.颜色状态 具体实现: import pygame from pygame.locals import * import sys, ...

  4. Class类与Java反射

    1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  5. 06jQuery-04-DOM操作

    jQuery既然是为了帮助你能从js的繁琐中解脱出来,自然在DOM操作上也有自己的一套. 1.修改Text和HTML 之前我们提到过,如果用JS的话,你要修改Text或者HTML需要用到其innerH ...

  6. 在Myeclipse中用Java语言操作mysql数据库

    package OperateMysql; import java.sql.*; public class MysqlTest { public static void main(String[] a ...

  7. C# 各种常用集合类型的线程安全版本

    在C#里面我们常用各种集合,数组,List,Dictionary,Stack等,然而这些集合都是非线程安全的,当多线程同时读写这些集合的时候,有可能造成里面的数据混乱,为此微软从Net4.0开始专门提 ...

  8. Linux Expect自动化交互脚本简介

    相关资料 维基百科:Expect SourceForge:The Expect Home Page TCL脚本言语简介 由于Expect是建立在TCL语言基础上的一个工具,因此首先检查一些TCL常见语 ...

  9. JSTL之c:set

    <jsp:setProperty>标记只能用来做一件事,那就是设置bean的性质. 但是,如果你想设置一个Map中的值呢?或者说想在Map中创建新的一项呢?或者只是希望创建一个新的请求作用 ...

  10. hibernate学习手记(2)

    1.javax.persistence.TransactionRequiredException: no transaction is in progress 出现该问题是我没有开启事务,我是在保存之 ...