全局异常过滤

使用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);
 }
上一篇:过滤所有非数字的字符


下一篇:asp.net mvc自定义特性之进行统一的权限检查