今天在博客园上看了一篇推荐文章,还说得蛮有道理:

http://www.cnblogs.com/richieyang/p/4779028.html

项目中确实有各种后台验证过程,最常见的莫过于判空,而在捕获到了异常信息后如何处理,各个项目组有自己不同的要求。我的项目组要求是:所有业务模块的异常不允许处理,而是直接抛出。

这种统一的处理方式一方面可以简化业务模块的开发过程,即在业务模块中直接throw自定义的异常信息即可,另一方面也可以对异常进行统一的处理,如记录日志等。

上文中也提到在MVC中可以通过ExceptionFilter来进行异常拦截,一下就记录一下MVC中的ExceptionFilter及ActionFilter的用法,其实还有ResultFilter,用于拦截Action执行完毕之后,生成View之前即之后的事件,网上有文章介绍利用ResultFilter实现页面静态化的功能,我没有细看,将来有需要可以研究下。

以下先记录ExceptionFilter及ActionFilter的用法:

1:ExceptionFilter

先定义自己的ExceptionFilter,在这个ExceptionFilter中,记录了异常日志(loggerFactory及logger应该通过IoC容器获取,这里仅作示例),并通过将filterContext.ExceptionHandled置为true来阻止异常抛出,实际上就是把这个异常吞掉了,这里这样处理仅作示例。

public class MyExceptionFilter : FilterAttribute, IExceptionFilter
{
     void IExceptionFilter.OnException(ExceptionContext filterContext)
     {
            var loggerFactory = new Log4NetLoggerFactory("Log4Net.config");
            var logger = loggerFactory.Create();
            logger.Debug("{0}错误信息:", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            logger.Debug(filterContext.Exception.Message);
            logger.Debug(filterContext.Exception.StackTrace);
            filterContext.ExceptionHandled = true;
      }
}            

定义之后,在需要捕获异常的Action方法上新增[MyExceptionFilter]特性即可。

2:ActionFilter

通过自定义的ActionFilter,拦截Action处理前(OnActionExecuting)及Action处理后(OnActionExecuted)事件,并在事件处理代码中进行日志记录(记录方式仅作演示,实际项目中最好通过IoC容器获取):

        public class MyLoggerFilter : FilterAttribute, IActionFilter
        {
            void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
            {
                var loggerFactory = new Log4NetLoggerFactory("Log4Net.config");
                var logger = loggerFactory.Create();
                logger.Debug("{0}-Action开始执行", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }

            void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
            {
                var user = filterContext.HttpContext.User.Identity.Name;
                var loggerFactory = new Log4NetLoggerFactory("Log4Net.config");
                var logger = loggerFactory.Create();
                logger.Debug("{0}-Action执行完毕", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
        }

在定义了自己的ActionFilter之后,仍然是按需在Action实现上新增[MyLoggerFilter]特性,即可对该Action进行Aop拦截。

利用MVC的自定义过滤器FilterAttribute、IActionFilter、IExceptionFilter实现异常处理等功能的更多相关文章

  1. MVC之 自定义过滤器(Filter)

    MVC之 自定义过滤器(Filter) 一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttri ...

  2. asp.net MVC之 自定义过滤器(Filter) - shuaixf

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...

  3. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  4. MVC之 自定义过滤器(ActionFilterAttribute)

    一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...

  5. [转]MVC之 自定义过滤器(Filter)

    本文转自:http://www.cnblogs.com/kissdodog/archive/2013/01/21/2869298.html 一.自定义Filter 自定义Filter需要继承Actio ...

  6. MVC之自定义过滤器(ActionFilterAttribute)

    一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...

  7. MVC系统过滤器、自定义过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  8. ASP.NET MVC学习系列(4)——MVC过滤器FilterAttribute

    1.概括 MVC提供的几种过滤器其实也是一种特性(Attribute),MVC支持的过滤器类型有四种,分别是:AuthorizationFilter(授权),ActionFilter(行为),Resu ...

  9. ASP.NET MVC 系统过滤器、自定义过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

随机推荐

  1. KSFramework:Unity3D开发框架快速入门

    KSFramework知识 https://github.com/mr-kelly/KSFramework KSFramework是一个整合KEngine.SLua和一些开发组件组成的全功能Unity ...

  2. [No000013]在Office中关闭自动拼写检查和自动语法检查

    大家知道有时候语法检查很麻烦,搞得文档里都是红线和绿线.解决办法就是关闭自动拼写检查.现在我们来介绍怎么关闭office包括Word .Outlook .PowerPoint .OneNote .Pu ...

  3. 用AutoCompleteTextView实现历史记录提示

    自定义AutoCompleteTextView 博客分类: android进阶 android  网上找到的都是同ArrayAdapter一起使用的,有时候需要自定义风格,咋办?follow me! ...

  4. android小游戏 飞机躲子弹

    最近android老师让每人写一个小东西,因为之前学awt时写过一个java版的飞机躲子弹,所以这次想写成android版的. 文件直接导入就行http://files.cnblogs.com/fil ...

  5. Java多线程之Runable与Thread

    Java多线程是Java开发中的基础内容,但是涉及到高并发就有很深的研究可做了. 最近看了下<Java并发实战>,发先有些地方,虽然可以理解,但是自己在应用中很难下手. 所以还是先回顾一下 ...

  6. FineUI v4.0.3 (beta) 和 FineUI v3.3.3 发布了!

    关于FineUI基于 ExtJS 的开源 ASP.NET 控件库 FineUI的使命创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No Web ...

  7. Oracle 常用函数

    主要是对项目中用过的 oracle 函数进行总结,并做出目录,方便后续项目是快速查找,提高效率. 01.Round (数值的四舍五入) 描述:传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算 ...

  8. DOM之parentNode与offsetParent

    DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...

  9. JAVA对象和XML文档、原来他们之间还有这一出

    最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是 通过socket发送xml格式的报文到指定服务器来进行信息的统一认证.. 因此组装xml格式的报文字符串以及解析服务器返回的xm ...

  10. GitHub中国区前100名到底是什么样的人?

    本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员 ...