MVC中的基本异常分类:
- Action异常 T
- view异常 T,
- service异常 T,
- 控制器异常 F(异常get不到),
- 404异常 F(异常Get不到)
先写异常IExceptionFilter扩展类(还要注意一点是异常的类型,如果是前台的ajax请求出的异常,你返回html页面ajax是收不到的,所以要判断filterContext.HttpContext.Request.isAjaxRequest()),为真的话,返回自定义格式的json异常信息数组:
public void OnException(ExceptionContext filterContext) { string controller = filterContext.RouteData.Values["Controller"].ToString(); string action = filterContext.RouteData.Values["Action"].ToString(); filterContext.Controller.ViewData["ErrorMessage"] = filterContext.Exception.Message; //此处exception是异常类型实例 //分级:自定义不同的异常类别,完成检测,然后分级处理 if (filterContext.HttpContext.Request.IsAjaxRequest()) //如果是ajax请求,不能返回html的,要返回json异常信息 { filterContext.Result = new JsonResult() { Data=new { success=0,message="请联系管理员"} }; } filterContext.Result = new ViewResult() //返回html页面 { ViewName = "~/Views/Shared/Error.cshtml", //出错后跳转的页面 ViewData = filterContext.Controller.ViewData }; filterContext.ExceptionHandled = true; //告诉系统异常已经处理了,不用再处理了 }
扩展好了之后后面就是注册了:具体注册方法见 上一篇 Filter的三种注册方式.
经过测试,上面所提到的5种异常前三种是可以捕获并处理的.但是后面两种异常如何处理???
这里就要用到真正的全局异常处理了:
只是简单的做了个例子,具体用到还要自行扩展.