在两个不同的应用程序中,一个是自定义的另一个是使用新的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)。
我很难过。我错过了什么?
答案 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 - 查看三个不同的来源
- web.config的&lt; deployment&gt;部分的零售物业。这是一个 部署时设置的有用属性 你的生产应用程序 服务器。这超越了任何其他 自定义错误的设置。
- web.config的&lt; customErrors&gt;部分的模式属性。这个设置 表示自定义错误是否存在 完全启用,如果是,则启用它们 仅针对远程请求启用。
- HttpRequest对象的IsLocal属性。如果启用了自定义错误 只需要远程请求,您需要 知道请求是否来自a 远程计算机。
醇>
这里的想法是,您可以在开发期间关闭“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>