【问题标题】:ASP.net MVC [HandleError] not catching exceptionsASP.net MVC [HandleError] 未捕获异常
【发布时间】:2010-10-11 19:11:16
【问题描述】:

在两个不同的应用程序中,一个是自定义的,另一个是您使用新的 VS2008 MVC 项目获得的示例 MVC 应用程序,[HandleError] 没有捕获异常。

在我的示例应用程序中:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw new Exception();
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

这只是默认控制器,但会抛出异常以进行测试。

但它不起作用。它不会转到默认的 error.aspx 页面,而是在浏览器中显示调试信息。

问题首先出现在我正在处理的自定义应用程序中,这导致我使用示例应用程序对其进行测试。考虑到这与我在自定义应用程序中所做的更改有关,我完全没有改变示例应用程序,只是在 index 方法中抛出异常(糟糕)。

我被难住了。我错过了什么?

【问题讨论】:

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


    【解决方案1】:

    在 Web.config 中,更改 customErrors:

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

    如果模式为 Off 或 RemoteOnly,那么您将看到黄屏死机,而不是自定义错误页面。原因是开发人员通常希望在黄屏死机上获得更详细的信息。

    【讨论】:

    • 我这样做了,但没有用。我发现在 MVC2 应用程序中,默认模板中有多个 Web.config 文件。您需要将 customErrors 标记应用到解决方案中最根目录的 Web.config。
    • @Mike,所有 MVC 版本都是如此。
    • 对我不起作用..检查我的问题:stackoverflow.com/questions/11231165/…
    【解决方案2】:

    重要提示:请注意您的错误页面本身没有错误!

    如果是这样,您最终会看到那个 ASP.NET 自定义错误页面,最终会绕圈子,把头发扯掉。只需从页面中删除可能导致错误的所有内容并进行测试。

    此外,关于“customErrors”的开启或关闭,是否会显示友好的错误页面(您的 Errors.aspx)页面有几个影响因素。

    this blog(以下除外)

    HttpContext.IsCustomErrorEnabled - 查看三个不同的来源

    1. web.config 的 部分的零售属性。这是一个 部署时设置的有用属性 您对生产的应用程序 服务器。这会覆盖任何其他 自定义错误的设置。
    2. web.config 的 部分的模式属性。这个设置 指示自定义错误是否是 完全启用,如果是这样,他们是否 仅对远程请求启用。
    3. HttpRequest 对象的 IsLocal 属性。如果启用了自定义错误 仅对于远程请求,您需要 知道请求是否来自 远程计算机。

    这里的想法是,您可以在开发期间关闭“customErrors” - 当您确实想查看错误时,然后将其仅用于生产。

    MSDN article 进一步讨论了该属性。

    【讨论】:

      【解决方案3】:

      这个问题的另一个原因可能是,

      在 Template MVC Application(由 VS2008 / VS2008 Express 生成)中,Error.aspx(由 VS 生成)使用 Master Page。

      如果母版页访问任何 ViewData 它将抛出空引用 Exception ,那么 error.aspx 将不会显示。

      将此简单代码用作您的 Error.aspx ,它将解决问题(以及 CustomErrors=On )

      <%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
      <%= Model.Exception.Message %>
      

      【讨论】:

      • “如果母版页访问任何 ViewData,它将抛出空引用异常”,该行让我恢复了理智。谢谢!
      【解决方案4】:

      我也一直在努力解决这个问题,我相信我现在明白了这个问题。

      简而言之,让[HandleError] 按预期工作的要求是:

      您必须在 web.config 中启用自定义错误,并且您还必须在 &lt;customErrors&gt; 标记中指定错误视图的位置。

      例子:

      <customErrors mode="On" defaultRedirect="Error" />
      

      省略 defaultRedirect="Error" 部分将在浏览器中产生 500 错误,而不是 ASP.NET 错误页面 (YSOD)。

      您也不必处于发布模式。我使用 Debug 版本对此进行了测试,效果很好。

      我的环境是使用 .NET 4 和标准“ASP.NET MVC 2 Web 应用程序”项目模板的 Visual Studio 2010。

      让我感到困惑的是 HandleErrorAttribute 类的 MSDN 文档。它没有明确说明您必须在 web.config 中打开自定义错误。我假设我需要的只是[Handle Error] 属性。

      【讨论】:

      【解决方案5】:

      我曾经发生过一些愚蠢的情况,所以可能对某人有帮助。

      确保您已将&lt;customErrors mode="On" /&gt; 添加到正确 web.config 文件中。


      有时(尤其是当您使用 Resharper 之类的工具,并通过键入文件名而不是通过解决方案资源管理器打开文件时),您可以简单地从 Views 文件夹甚至从另一个文件夹打开 web.config项目。

      【讨论】:

      • 我永远不会知道他们为什么决定需要两个网络配置:(
      • 第二个是 Razor 引擎本身。您可能可以将视图放置在任何地方,因此该项目可能没有 web.config(对于 Web 项目)或者您需要单独的设置。我同意,它可能以其他方式来防止这种编码错误,但总的来说它是有道理的。
      【解决方案6】:

      注意:在我的例子中,我试图让HandleError 属性捕获exception 抛出在Controllers 构造函数中!它当然不会抓住它。 HandleError 属性只捕获在Controller actions 中抛出的异常。它就在 MSDN 页面中(应该多加注意):

      表示用于处理异常的属性 由动作方法抛出。

      发生的另一件事是控制器的 OnException(ExceptionContext exceptionContext) 被覆盖的方法从未被调用。再说一遍:当然不会调用它,因为我在 Controller 的构造函数中抛出了异常。

      我花了 1 小时试图弄清楚这一点。 :o) 希望它能帮助下一个灵魂......

      作为提示:请记住 HandleError 属性仅捕获 500 错误。对于其他人,您应该在Web.config 中声明&lt;customErrors&gt; 部分:

      <customErrors mode="On">
        <error statusCode="403" redirect="~/403" />
        <error statusCode="404" redirect="~/404" />
      </customErrors>
      

      【讨论】:

        猜你喜欢
        • 2012-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2016-05-09
        相关资源
        最近更新 更多