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

39 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是默认控制器,抛出异常进行测试.

但它不起作用.它没有进入默认的error.aspx页面,而是在浏览器中显示调试信息.

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

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

Cra*_*ntz 67

在Web.config中,更改customErrors:

<system.web>
  <customErrors mode="On">
  </customErrors>
Run Code Online (Sandbox Code Playgroud)

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

  • 这样做了.谢谢. (4认同)
  • 我这样做了,但没有用.我发现在MVC2应用程序中,默认模板中有多个Web.config文件.您需要将customErrors标记应用于解决方案中最根本的Web.config. (3认同)

Sim*_*ver 16

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

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

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

看到这个博客(下面除外)

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

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

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

这篇MSDN文章进一步讨论了该属性.


Pal*_*ani 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 %>
Run Code Online (Sandbox Code Playgroud)

  • "如果Master Page访问任何ViewData,它将抛出null引用异常"这一行给我带来了理智.谢谢! (4认同)

Run*_*ick 8

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

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

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

例:

<customErrors mode="On" defaultRedirect="Error" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Aga*_*gat 5

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

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


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