ASP.NET MVC中异常处理&自定义错误页详析

2019-05-25 13:18:21于海丽

如果需要将自定义的异常过滤器应用到所有的controller的action上,那么需要将该自定义异常过滤器注册到全局,代码如下:

using Blog20180413.Filters;
using System.Web;
using System.Web.Mvc;

namespace Blog20180413
{
 public class FilterConfig
 {
 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
  filters.Add(new CustomExceptionFilterAttribute());
 }
 }
}

2、通过在Global.asax 中定义Application_Error方法 实现异常处理和自定义错误页

上面提到的 自定义异常过滤器只能捕获在执行action方法过程中抛出的异常(即使注册为全局过滤器也只能捕获action方法执行过程中抛出的异常),如果需要捕获更高级别的异常,也就是在请求执行过程中出现的任何异常(如在控制器的构造函数中抛出异常),那么可以使用该种方式,代码如下:

using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Blog20180413
{
 public class MvcApplication : System.Web.HttpApplication
 {
  static readonly ILog log = LogManager.GetLogger(typeof(MvcApplication));
  protected void Application_Start()
  {
   AreaRegistration.RegisterAllAreas();
   FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
   RouteConfig.RegisterRoutes(RouteTable.Routes);
   XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("~/web.config")));
  }

  protected void Application_Error(object sender, EventArgs e)
  {
   Exception exception = Server.GetLastError();
   //Server.ClearError();
   //这里记录错误日志信息
   log.Error("MvcApplication 捕获异常", exception);
   //跳转到指定的自定义错误页
   Response.Redirect("/CustomErrorHandle/CustomErrorPage");
  }
 }
}

3、通过配置system.web->customErrors节点 实现自定义错误页

当你的站点发生异常时,如果你只是想简单的跳转到一个自定义错误页面,而不是对异常进一步处理时,那么你可以简单的作如下配置操作即可:

需要在web.config中做如下配置:

 <system.web>
  <customErrors mode="On" defaultRedirect="CustomErrorPage">
  </customErrors>
 </system.web>

注意:这里的CustomErrorPage是一个视图文件,放在Shared共享目录下。

如果你注册了HandleErrorAttribute异常过滤器到全局,那么在你的错误页中将能获取到和异常相关的一些信息。但此时配置到defaultRedirect的值的必须是Error

也就是自定义错误视图页面的名称必须为Error.cshtml,并且放在Shared目录,当然,你也可以通过在创建HandleErrorAttribute全局过滤器的过程中,设置器View属性,这样你就可以不用讲错误视图的名称设置为Error了.如下:

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 {
    HandleErrorAttribute errorAttribute = new HandleErrorAttribute();
    errorAttribute.View = "CustomErrorPage";
    filters.Add(errorAttribute);
 }