标签:filterContext 自定义 过滤 HandleErrorAttribute filters 全局 异常 页面
使用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);
}
标签:filterContext,自定义,过滤,HandleErrorAttribute,filters,全局,异常,页面 来源: https://www.cnblogs.com/qungeblog/p/14377336.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。