使用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);
}