【问题标题】:Error Handling in asp.net mvc 3asp.net mvc 3 中的错误处理
【发布时间】:2011-08-25 03:27:45
【问题描述】:

在 asp.net mvc 3 中是否有内置的或适当的方法来处理错误?

这就是我想做的:

  1. 如果应用程序崩溃或抛出错误,它会转到特定的错误页面。
  2. 我可以从控制器操作中抛出我自己的错误。 (然后转到错误页面)。

我找到了以下方法:

  1. 我知道还有很长的路要走 here。 (对于 v1 和 v2,但也 适用于 v3)。
  2. 使用错误句柄属性here

我该如何正确处理这个问题?

如果解决方案类似或类似于上面列表中的#1,我正在使用 ninject 并且我没有创建基类。我该怎么做?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 error-handling ninject


    【解决方案1】:

    用于全局错误处理
    您所要做的就是在 web.config 页面中更改 customErrors mode="On"
    错误将通过 Error.cshtml 显示在共享文件夹中。

    确保 Error.cshtml 布局不为空
    [它应该类似于:@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
    或删除 Layout=null 代码块]
    Error.cshtml 的示例标记:-

    @{ Layout = "~/Views/Shared/_Layout.cshtml"; } 
    
    @model System.Web.Mvc.HandleErrorInfo
    
    <!DOCTYPE html>
    <html>
    <head>
        <title>Error</title>
    </head>
    <body>
        <h2>
            Sorry, an error occurred while processing your request.
        </h2>
        <p>Controller Name: @Model.ControllerName</p>
        <p>Action Name : @Model.ActionName</p>
        <p>Message: @Model.Exception.Message</p>
    </body>
    </html>
    

    针对特定的错误处理
    将 HandleError 属性添加到控制器类中的特定操作。为该特定错误提供“视图”和“异常类型”。
    NotImplemented 异常处理程序示例:

    public class MyController: Controller
        {
            [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))]
            public ActionResult Index()
            {
                throw new NotImplementedException("This method is not implemented.");
                return View();
            }
    }
    

    【讨论】:

      【解决方案2】:

      我建议实现一个自定义 HandleErrorAttribute 操作过滤器。

      查看此链接了解更多详情:
      http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

      设置一个 HandleErrorAttribute 动作过滤器可以让您完全控制过滤器处理哪些动作,并且很容易在控制器级别进行设置,甚至可以通过在自定义基础控制器上设置站点级别进行设置,并拥有您的所有控制器都继承自基本控制器。

      我对此做的其他事情是,我有一个单独的 HandleJsonErrorAttribute,它通过返回 Json 响应而不是自定义页面来响应 Ajax 调用。

      更新:

      根据以下一些问题,这是我使用的HandleJsonErrorAttribute 示例:

      public class HandleJsonErrorAttribute : HandleErrorAttribute
      {
          public override void OnException(ExceptionContext filterContext)
          {
              var serviceException = filterContext.Exception as ServiceException;
      
              filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
      
              filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } };
      
              filterContext.ExceptionHandled = true;
          }
      }
      

      这是我用来处理这些未经处理的异常的 jQuery:

      $(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
          showPopdown($.parseJSON(jqXHR.responseText).message);
      });
      

      这让我的 Ajax 方法变得非常轻量——它们只处理返回正常的 Json,并且在发生未处理的异常时,带有错误状态代码的消息会被包装在 Json 中并返回。

      另外,在我的实现中,我有一个从服务中抛出的自定义 ServiceException,它从服务层发送消息而不是通用消息。

      【讨论】:

      • 您能否举例说明我将如何使用HandleJsonErrorAttribute 处理这些ajax 错误调用?
      • 是的,我也对 HandleJsonErrorAttribute 感兴趣。你能给我更多的信息和/或一个例子吗?
      • 不错的代码!这个对我有用。谢谢!我只将 StatusCode 更改为“Ok”并在我自己的代码中处理异常。对于正在搜索如何使用的每个人:只需将属性放在 Action 中(例如:[HandleJsonErrorAttribute]public JsonResult ActionNameX(object someArgs) { ... }
      【解决方案3】:

      【讨论】:

        【解决方案4】:

        我认为最简单的方法是使用 ExceptionHandler 属性,因为它随时可以在您创建新的 ASP.NET MVC 3 项目时使用。您仍然可以像往常一样将 Web.config 配置为使用自定义错误页面并在全局 Application_Error 方法中处理异常,但是当发生异常时,URL 不会像新的 MVC 3 那样显示得那么好。

        【讨论】:

        • 确切的属性名称是HandleError。
        【解决方案5】:

        如果您想自定义一种异常处理方式,您可以在 MVC 中创建自定义异常。 你可以在这里找到有用的帖子。 http://www.professionals-helpdesk.com/2012/07/creating-custom-exception-filter-in-mvc.html

        【讨论】:

        • 请发布主题内容,而不是链接。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 2018-02-27
        • 1970-01-01
        • 2011-06-10
        • 2014-03-26
        • 2012-10-04
        • 1970-01-01
        相关资源
        最近更新 更多