39

在两个不同的应用程序中,一个是自定义的,另一个是您使用新的 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 方法中抛出异常(糟糕)。

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

4

6 回答 6

69

在 Web.config 中,更改 customErrors:

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

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

于 2009-03-06T17:30:36.437 回答
16

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

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

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

请参阅此博客(以下除外)

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

  1. web.config 的 <deployment> 部分的零售属性。这是在将应用程序部署到生产服务器时设置的有用属性。这会覆盖自定义错误的任何其他设置。
  2. web.config 的 <customErrors> 部分的 mode 属性。此设置指示是否完全启用自定义错误,如果启用,是否仅对远程请求启用。
  3. HttpRequest 对象的 IsLocal 属性。如果仅对远程请求启用自定义错误,您需要知道该请求是否来自远程计算机。

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

MSDN 文章进一步讨论了该属性。

于 2009-05-20T01:52:06.773 回答
13

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

在 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 %>
于 2009-07-27T14:21:30.947 回答
8

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

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

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

例子:

<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]属性。

于 2010-07-15T00:14:57.443 回答
5

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

确保您已添加<customErrors mode="On" />正确 web.config的文件。


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

于 2013-11-12T15:33:24.437 回答
2

注意:在我的情况下,我试图让HandleError属性捕获s构造函数exception中的抛出!它当然不会抓住它。该属性仅捕获在actions中引发的异常。它就在 MSDN 页面中(应该更加注意这一点):ControllerHandleErrorController

表示用于处理由操作方法引发的异常的属性。

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

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

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

<customErrors mode="On">
  <error statusCode="403" redirect="~/403" />
  <error statusCode="404" redirect="~/404" />
</customErrors>
于 2014-04-08T00:32:57.477 回答