ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

全局异常过滤

2021-02-05 14:02:34  阅读:170  来源: 互联网

标签:filterContext 自定义 过滤 HandleErrorAttribute filters 全局 异常 页面


使用HandleErrorAttribute处理异常

ASP.NET MVC 默认提供了一个异常过滤器HandleError特性,使用该特性可以极为方便的捕捉并处理控制器和操作抛出的异常,也可以将此特性注册为全局异常过滤器从而捕捉项目中的所有异常。如果想要简单的消灭错误黄页(错误详细页),使用HandlerErrorAttribute是不错的选择!

HandleErrorAttribute使用

使用HandleErrorAttribute处理异常很简单,首先要开启Web.config配置文件中的自定义错误,因为HandleError特性是依赖自定义错误的,customErrors的Mode必须要设置为OnRemoteOnly

<system.web>
    <customErrors mode="On">
      <error statusCode="404" redirect="/Error/Page404"/>
    </customErrors>
  </system.web>

<error statusCode="404" redirect="/Error/Page404"/>当出现404错误时会自动跳转到Page404页面

到了这里基本上就成功启用了异常过滤器,因为新建的ASP.NET MVC 5项目默认将HandleError注册为全局异常过滤器,只要项目中的控制器和操作方法有抛出异常,默认就会被HandleError特性捕获,从而跳转到默认的错误详细页面~/Views/Shared/Error.cshtml。打开项目下App_StartFilterConfig类(全局过滤器配置类),可以看到已经被注册的HandleErrorAttribute类:

 	public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }

使用自定义错误页面

asp.net MVC中默认的错误页面不是很友好,我们可以使用自定义的错误页面

首先创建一个MyHandleErrorAttribute类,该类继承HandleErrorAttribute,然后对HandleErrorAttribute中的OnException方法进行重写

 public class MyHandleErrorAttribute : HandleErrorAttribute
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        public override void OnException(ExceptionContext filterContext)
        {
            //1、获取异常对象
            Exception ex = filterContext.Exception;

            //2、获取请求的类名和方法名
            string strController = filterContext.RouteData.Values["controller"].ToString();
            string strAction = filterContext.RouteData.Values["action"].ToString();

            //3、记录异常日志
            string errMsg = String.Format("异常信息:{0};",ex.ToString());
            logger.Error(errMsg);

            //4、重定向友好页面
            filterContext.Result = new RedirectResult("/Error/Page500?msg=" + 				 System.Web.HttpUtility.UrlEncode(filterContext.Exception.Message));

            //5、标记异常已经处理完毕
            filterContext.ExceptionHandled = true;

            base.OnException(filterContext);
        }
    }

上面第四部就是获取错误信息后重定向到自定义的错误页面

接下来在Controller或者Action上添加我们自定义的MyHandleErrorAttribute属性,当该Controller或者Action报错是就会跳转到我们自定义的错误页面

 [MyHandleErrorAttribute]
    public ActionResult Index()
    {
        throw new Exception("抛出异常");
        return View();
    }

跳转后的自定义错误页面:

全局过滤异常

上面的方法每个Controller或者Action上都添加MyHandleErrorAttribute属性有点麻烦,我们可以使用全局过滤的方式。

打开项目下App_StartFilterConfig类添加自定义的MyHandlerErrorAttribute

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
     filters.Add(new MyHandleErrorAttribute());
 }

这样就可以全局过滤异常了,不用再单独添加过滤属性了

当注册多个的时候可以添加order属性,决定执行的先后顺序。

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
     filters.Add(new HandleErrorAttribute(),2);
     filters.Add(new MyHandleErrorAttribute(),1);
 }

标签:filterContext,自定义,过滤,HandleErrorAttribute,filters,全局,异常,页面
来源: https://www.cnblogs.com/qungeblog/p/14377336.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有