zoukankan      html  css  js  c++  java
  • 利用MVC的自定义过滤器FilterAttribute、IActionFilter、IExceptionFilter实现异常处理等功能

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

    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拦截。

  • 相关阅读:
    百度AI开放平台 情感倾向分析实例以及gbk编码解决
    根据cid获取哔哩哔哩弹幕
    python3 doc2vec文本聚类实现
    python3 LDA主题模型以及TFIDF实现
    偶得李春芬先生书信一函
    STATA一小步 我的一大步
    2013-2015南京大学历史学系若干考试题目汇编
    ArcPy批量计算Mean Center的两个实例
    解决Gephi导入csv文件时提示“边表格需要一个包含节点标号‘源’和‘目标’列” 问题的两个方案
    Vertx 实现webapi实战项目(二)
  • 原文地址:https://www.cnblogs.com/you-you-111/p/4829282.html
Copyright © 2011-2022 走看看