首页 > 代码库 > MVC四大筛选器—ExceptionFilter

MVC四大筛选器—ExceptionFilter

该筛选器是在系统出现异常时触发,可以对抛出的异常进行处理。所有的ExceptionFilter筛选器都是实现自IExceptionFilter接口  

    public interface IExceptionFilter    {        void OnException(ExceptionContext filterContext);    }

实现OnException方法来实现对异常的自定义处理

MVC4中实现了默认的异常处理机制,源码如下 

public virtual void OnException(ExceptionContext filterContext)        {            if (filterContext == null)            {                throw new ArgumentNullException("filterContext");            }            if (filterContext.IsChildAction)            {                return;            }            // If custom errors are disabled, we need to let the normal ASP.NET exception handler            // execute so that the user can see useful debugging information.            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)            {                return;            }            Exception exception = filterContext.Exception;            // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),            // ignore it.            if (new HttpException(null, exception).GetHttpCode() != 500)            {                return;            }            if (!ExceptionType.IsInstanceOfType(exception))            {                return;            }            string controllerName = (string)filterContext.RouteData.Values["controller"];            string actionName = (string)filterContext.RouteData.Values["action"];            HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);            filterContext.Result = new ViewResult            {                ViewName = View,                MasterName = Master,                ViewData = new ViewDataDictionary<HandleErrorInfo>(model),                TempData = filterContext.Controller.TempData            };            filterContext.ExceptionHandled = true;            filterContext.HttpContext.Response.Clear();            filterContext.HttpContext.Response.StatusCode = 500;            // Certain versions of IIS will sometimes use their own error page when            // they detect a server error. Setting this property indicates that we            // want it to try to render ASP.NET MVC‘s error page instead.            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;        }
Application_Start中将HandleErrorAttribute添加到全局筛选器GlobalFilterCollection中,系统即会对异常进行对应的处理。
我们现在实现一个自定义的异常处理筛选器,在处理完后记录异常信息至日志文件中  
 public class MyExceptionHandleAttribute : HandleErrorAttribute    {        public MyExceptionHandleAttribute()            : base()        {        }        public void OnException(ExceptionContext filterContext)        {            base.OnException(filterContext);            //记录日志            log.Info(filterContext.Exception);        }    }
在GlobalFilterCollection添加MyExceptionHandleAttribute 即可使用自定义的异常筛选器来处理

MVC四大筛选器—ExceptionFilter