【问题标题】:How do I handle uncaught exceptions in an ASP.NET MVC 3 application?如何在 ASP.NET MVC 3 应用程序中处理未捕获的异常?
【发布时间】:2013-09-25 02:20:38
【问题描述】:

我想在我的 ASP.NET MVC 3 应用程序中处理未捕获的异常,以便我可以通过应用程序的错误视图将错误传达给用户。如何拦截未捕获的异常?我希望能够在全局范围内执行此操作,而不是针对每个控制器(尽管我也不介意知道如何执行此操作)。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 exception-handling


    【解决方案1】:

    您可以在Global.asax中设置全局错误过滤器

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
    

    上面设置了一个默认的错误处理程序,它将所有异常都定向到标准错误视图。错误视图输入到System.Web.Mvc.HandleErrorInfo 模型对象,该对象公开异常详细信息。

    您还需要在 web.config 中打开自定义错误才能在本地计算机上看到这一点。

    <customErrors mode="On"/>
    

    您还可以为特定的错误类型定义多个过滤器:

    filters.Add(new HandleErrorAttribute
    {
        ExceptionType = typeof(SqlException),
        View = "DatabaseError",
        Order = 1
    });
    
    /* ...other error type handlers here */
    
    filters.Add(new HandleErrorAttribute()); // default handler
    

    请注意,HandleErrorAttribute 只会处理 MVC 管道内部发生的错误(即 500 个错误)。

    【讨论】:

      【解决方案2】:

      您可以使用 HandleErrorAttribute 过滤器,

      [ErrorHandler(ExceptionType = typeof(Exception), View = "UnhandledError", Order = 1)]
       public abstract class BaseController : Controller
      
              {
          }
      

      基本上,您可以将它放在基本控制器之上,并在共享视图文件夹中定义 UnhandledError.cshtml。

      如果您想在显示错误消息之前记录未处理的错误,那么您可以扩展 HandleErrorAttribute 类并将执行日志记录的逻辑放在 OnException 方法中。

      public class MyErrorHandlerAttribute : HandleErrorAttribute
          {
      
      
              public override void OnException(ExceptionContext exceptionContext)
              {
                  Logger.Error(exceptionContext.Exception.Message,exceptionContext.Exception);
                  base.OnException(exceptionContext);
              }
          }
      

      【讨论】:

        【解决方案3】:

        为了完整起见,Global.asax 中还有 Application_Error 处理程序。

        【讨论】:

          【解决方案4】:

          全局错误处理

          1. 在 web.config 中添加

          2. Error.cshtml 将显示错误,该文件位于 shared 文件夹

          3. Error.cshtml 中的更改
          @model System.Web.Mvc.HandleErrorInfo @{ ViewBag.Title = "错误"; }

          抱歉,处理您的请求时出错。

          控制器名称:@Model.ControllerName

          动作名称:@Model.ActionName

          消息:@Model.Exception.Message

          【讨论】:

            【解决方案5】:

            为了完成这项工作,我遵循了以下 blog post,然后在 &lt;system.web&gt; 节点内的两个 Web.config 文件(根文件和 Views 文件夹中的文件)中添加了以下内容:

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

            希望对你有帮助...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-26
              • 2017-03-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多