学一学MVC的过滤器--异常处理

学习MVC不久,看到公司的项目里有日志记录功能,出于自己的原因一直没有看看是如何实现的,后来看了个学习视频和一些博文,才发现采用MVC里的过滤器 Filter 可以很容易实现,比较常见也很容易的做法就是继承  IActionFilter,IExceptionFilter 接口,然后实现里面的方法即可。

下面看一下代码,这是公司项目的一段代码,主要是将项目中出现的异常记录在 每天的txt日志文件里。当然实现日志的方法有很多种,这个只是其中一种,如果出现了IO错误,这种方法就不好说啦。

 public class AppHandleErrorAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            //System.Web.Mvc.ExceptionContext

            if (!filterContext.ExceptionHandled )
            {
                //如果已经自己写了try  catch,那么可不用记录日志
                var ds = (System.Web.Configuration.CompilationSection)System.Configuration.ConfigurationManager.GetSection("system.web/compilation");
                if (ds.Debug)
                {
                   //创建相关文件,并写入异常记录
                    var dir = System.Web.HttpContext.Current.Server.MapPath("~") + @"\log\";
                    if (!System.IO.Directory.Exists(dir)) { System.IO.Directory.CreateDirectory(dir); }
                    var path = dir + DateTime.Now.ToString("yyyyMMdd") + "_site.txt";
                    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(path, true))
                    {
                        var dataException = filterContext.Exception;
                        var message = dataException.Message;

                        sw.WriteLine();
                        sw.WriteLine("-----------------"+DateTime.Now.ToString("HH:mm:ss") + "-----------------");
                        sw.WriteLine(message);
                        sw.WriteLine("Message:" + dataException.Message);
                        sw.WriteLine("StackTrace:" + dataException.StackTrace.ToString());
                        sw.Flush();
                        sw.Close();
                    }
                }
                filterContext.ExceptionHandled = true;//异常已经处理,程序可以不用在处理一遍
                //var link = new UrlHelper(filterContext.RequestContext).Action("Index", "CustomError");
                //filterContext.Result = new RedirectResult(link);

                //filterContext.Result = new ContentResult() { Content = "<center>网络连接异常,请<a href=‘javascript:;‘ onclick=‘location.reload()‘>刷新</a>重试</cener>", ContentType = "text/html" };
                filterContext.Result = new ContentResult() { Content = "<center>当前网络发生故障,请刷新页面重试(点击<a href=‘javascript:;‘ onclick=‘location.reload()‘>刷新</a>)</cener>", ContentType = "text/html" };

            }

        }
    }

上边这段代码很简单,如果只是单纯记录某一个Action的Exception,那么调用方法如下

[AppHandleError]
public ActionResult  xxAction()
{
    return View();
}

如果是全局的设置,那么就要在项目的Global.ascx 里面加上这么一段话,注册 自定义的Filter

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {           
           filters.Add(new AppHandleErrorAttribute());
        }
        
        protected void Application_Start()
        {
           //  AreaRegistration.RegisterAllAreas();
           //  调用注册方法
               RegisterGlobalFilters(GlobalFilters.Filters);
           //  RegisterRoutes(RouteTable.Routes);
        }

下面进入实战Demo

1.编写AppHandleErrorAttribute,代码已经贴出

2.在需要记录异常的Action上添加这个属性

        [AppHandleError]
        public ActionResult Index()
        {
            throw new Exception("记录日志的内容");
            return View();
        }

先看一下没加 这个过滤器的页面,很明显黄页:

下面是添加过滤器的运行效果:

那么这个页面就是错误处理页了,我这里是输出的内容,也可以将filterContext.Result 设置成为ViewResult,或者跳转到新的错误页面。再看一下日志记录:

可以看到,异常日志已经添加到相关的txt日志文件里面。

说明:如果在Global里面增加了项目配置,那么在Action上就不用标注这个过滤器,所有未经过Try  catch的异常都可以捕获处理,代码,图略。

所以,try  catch不是什么情况下都适用,如果不影响重要业务的情况下,可以使用try  catch来处理业务,如果是比较重大的错误,就需要日志记录了。今天就到这里吧,第一次写这种博文,也算是自己的学习感想。有不足或者更好的方法欢迎批评指出。

学一学MVC的过滤器--异常处理,布布扣,bubuko.com

时间: 2024-08-05 11:09:04

学一学MVC的过滤器--异常处理的相关文章

我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括浏览器要发送的关键数据等内容都在Html内容里面,听起来不错,但是假如我们仿造类似的Html内容,更改里面关键数据,在浏览器运行起来会怎么样呢?好下面我们就做这样一个例子.       CSRF攻击例子 首先我们拿以前做好的person/edit作为例子 先看控制器代码 //初始页面        

[转]我要学ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件

本文转自:http://www.cnblogs.com/lukun/archive/2011/08/05/2128693.html 概述   在ASP.NET MVC框架中已经封装了很多基于Html标准的Html控件,我们可以方便的使用这些控件输出想要的内容,使开发变得快捷. 例如ASP.NET MVC框架包括以下设置标准的HTML控件(部分控件): Html.ActionLink() Html.BeginForm() Html.CheckBox() Html.DropDownList() Ht

跟我学ASP.NET MVC之十一:URL路由

跟我学ASP.NET MVC之十一:URL路由摘要: 在MVC框架之前,ASP.NET假定在请求的URLs和服务器硬盘文件之间有直接的关系.服务器的职责是接收浏览器请求,从相应的文件发送输出. 这种方法只能工作于Web表单,每一个ASPX页面既是一个文件,也是一个对应请求的自包含响应.而这对于MVC应用程序来说就无效了,因为请求是由控制器类里的行为方法处理的,而且没有磁盘上一对一关系的文件. ASP.NET平台使用路由系统处理MVC URLs.在这篇文章中,我将向你展示怎样为你的工程使用路由系统

mvc自定义全局异常处理

异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果:http://yanweidie.myscloud.cn/Home/Index 阅读目录 我理解中好的异常处理 自定义异常处理 问题拓展 总结 回到顶部 我理解中好的异常处理     好的异常信息处理应该具有以下几个优点 显示效果佳,而不是原生黄页 能够从异常中直接分析出异常源 能够记录传递异常信息

.Net Core MVC中过滤器简介

原文:.Net Core MVC中过滤器简介 在.Net Framework MVC 中有四种过滤器,授权过滤器(Authorize).Action 过滤器.结果过滤器(Result).异常过滤器(Exception)四种过滤器.在.Net Core MVC中,有五种过滤器,授权过滤器.Action过滤器.异常过滤器.结果过滤器.资源过滤器,新增了资源过滤器. .Net Core MVC和.Net Framework MVC在基本使用上差别不大,主要的还是框架的差别.其中路由是个很重要的东西,参

2014考研复试漫谈 --致考研刚刚结束的学弟学妹

回忆1( 成绩出来前): 去年考完研的时候,自己对于考上没有多大的把握,所以,考完研决定要做两手准备:一边准备复习,一边为找工作而准备着. 好像大学过的最紧张的日子莫过于此,因为眼看着周围的同学都纷纷出去找工作,并且有的同学还找到了不错的工作.自己现在考研占据了大量的时间,已经错过了所谓的找工作的黄金期,同时觉得自己的专业技能也不是很强,所以很担心自己万一考不上了,工作也不好找.那就真成了没人要的孩子了.没有什么比前途未卜更令人担忧了...所以,大过年的,我还在看王道新出的一本面试宝典,在巩固自

对学弟学妹的建议

在大学这四年我感觉自己是个失败者,在大学即将结束时留下了许多的遗憾.希望学弟学妹们能利用好大学四年,不能说没有遗憾,遗憾尽量的少一些吧. 学会利用大学里的资源. 老师.图书馆.身边的同学以及师兄.师姐他们都是你大学期间有形的宝贵资源.老师.师兄和师姐他们是你的长辈,能为你指导未来的方向和解决你大部分的学习和生活上的一些困惑.图书馆是你课下学习.扩展眼界.阅读各种杂书的好地方.身边的同学和你有着很多的相似点,他们也许和你有着相同的困惑,在大学期间把握和同学在一起的时光,因为他们有可能是你一辈子的朋

写给即将毕业的学弟学妹们!

1.Spring Security 目前支持认证一体化如下认证技术: HTTP BASIC authentication headers (一个基于IEFT  RFC 的标准) HTTP Digest authentication headers (一个基于IEFT  RFC 的标准) HTTP X.509 client certificate exchange  (一个基于IEFT RFC 的标准) LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境) Form-based auth

11th 回忆整个学期——告学弟学妹

告诉后来的学弟学妹,不要因为艰难而却步,坚持下去才知道,山的对面是什么.很多东西或许一开始看起来是无用,甚至无意义的,但是努力去做,你才知道价值所在.不要等一切结束了,才懂得自己错过了什么.