ASP.net MVC [HandleError]没有捕获异常

时间:2009-03-06 16:54:30

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

在两个不同的应用程序中,一个是自定义的另一个是使用新的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页面,而是在浏览器中显示调试信息。

问题首先出现在我正在处理的自定义应用程序中,这导致我使用示例应用程序对其进行测试。认为它与我在自定义应用程序中所做的更改有关,我将示例应用程序完全保持不变,并在索引方法中抛出异常(yuck)。

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

6 个答案:

答案 0 :(得分:67)

在Web.config中,更改customErrors:

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

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

答案 1 :(得分:16)

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

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

另外,对于'customErrors'为ON或OFF,有几个因素会影响是否显示友好错误页面(您的Errors.aspx)页面。

请参阅this blog(下方除外)

  

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

     
      
  1. web.config的&lt; deployment&gt;部分的零售物业。这是一个   部署时设置的有用属性   你的生产应用程序   服务器。这超越了任何其他   自定义错误的设置。
  2.   
  3. web.config的&lt; customErrors&gt;部分的模式属性。这个设置   表示自定义错误是否存在   完全启用,如果是,则启用它们   仅针对远程请求启用。
  4.   
  5. HttpRequest对象的IsLocal属性。如果启用了自定义错误   只需要远程请求,您需要   知道请求是否来自a   远程计算机。
  6.   

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

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

答案 2 :(得分:13)

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

在模板MVC应用程序(由VS2008 / VS2008 Express生成)中,Error.aspx(由VS生成)使用母版页。

如果Master Page访问任何ViewData,它将抛出null引用Exception,则不会显示error.aspx。

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

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

答案 3 :(得分:8)

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

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

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

示例:

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

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

此外,您不必处于发布模式。我使用Debug构建测试了它,它工作正常。

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

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

答案 4 :(得分:5)

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

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


有时候(尤其是当您使用Resharper之类的东西,并通过键入其名称而不是通过解决方案资源管理器打开文件时),您只需从Views文件夹或甚至从另一个文件夹打开web.config项目

答案 5 :(得分:1)

注意:在我的情况下,我试图获取HandleError属性来抓住exception 构造函数 <{1}}内的Controller / STRONG>!当然它不会抓住它。 HandleError属性仅捕获Controller 操作中引发的异常。它就在MSDN页面中(应该更加注意):

  

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

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

我花了1个小时试图解决这个问题。 :o)希望它有助于下一个灵魂......

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

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