全局异常过滤
使用HandleErrorAttribute处理异常
ASP.NET MVC 默认提供了一个异常过滤器HandleError特性,使用该特性可以极为方便的捕捉并处理控制器和操作抛出的异常,也可以将此特性注册为全局异常过滤器从而捕捉项目中的所有异常。如果想要简单的消灭错误黄页(错误详细页),使用HandlerErrorAttribute是不错的选择!
HandleErrorAttribute使用
使用HandleErrorAttribute处理异常很简单,首先要开启Web.config配置文件中的自定义错误,因为HandleError特性是依赖自定义错误的,customErrors的Mode必须要设置为On或RemoteOnly:
<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_Start的FilterConfig类(全局过滤器配置类),可以看到已经被注册的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_Start的FilterConfig类添加自定义的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);
}

浙公网安备 33010602011771号