ASP.NET MVC4 异常拦截

ASP.NET MVC4 程序发生异常时,通过拦截Action的异常,重写ActionFilterAttribute 的方法OnActionExecuted实现。

具体实现代码如下:

    /// <summary>
    /// 拦截Action的异常
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public class ExceFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Exception != null)
            {
                object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(LigerUIExceptionResultAttribute), true);
                if (attrs.Length == 1)//判断是否属于LigerUIResult的Action
                {
                    string msgTmp= "<b>异常消息:  </b>{0}</p><b>触发Action:  </b>{1}</p><b>异常类型:  </b>{2}";
                    var excResult = new JsonResult();
                    excResult.Data = AjaxResult.Error(string.Format(msgTmp,
                                filterContext.Exception.GetBaseException().Message,
                                filterContext.ActionDescriptor.ActionName,
                                filterContext.Exception.GetBaseException().GetType().ToString()));
                    LogHelper.WriteLog("系统错误:" + excResult.Data);
                    filterContext.Result = excResult;
                }
                else
                {
                    filterContext.Controller.ViewData["ErrorMessage"] = String.Format(@"<b>异常消息: {0}</br><b>触发Action:  </p>{1}</br><b>异常类型:  </b>{2}",
                        filterContext.Exception.GetBaseException().Message,
                        filterContext.ActionDescriptor.ActionName,
                        filterContext.Exception.GetBaseException().GetType().ToString());
                    LogHelper.WriteLog("系统错误:" + filterContext.Controller.ViewData["ErrorMessage"].ToString ());
                    filterContext.Result = new ViewResult()
                   {
                       ViewName = "Error",
                       ViewData = filterContext.Controller.ViewData,
                   };

                }
                filterContext.ExceptionHandled = true;
            }
        }
    }