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 == )//判断是否属于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;
}
}
}