ASP.net MVC 不捕捉exception

在两个不同的应用程序中,一个是用VS2008 MVC项目自定义另一个样例MVC应用程序,[HandleError]不捕捉exception。

在示例应用程序中我有:

[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(); } } 

这只是默认的控制器,抛出了一个用于testing的exception。

但它不起作用。 而不是去默认的error.aspx页面,它显示在浏览器中的debugging信息。

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

我很难过 我错过了什么?

在Web.config中,更改customErrors:

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

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

重要提示:小心你的错误页面本身没有错误!

如果是这样,你最终会得到这个ASP.NET自定义错误页面,并最终围绕着你的头发。 只是将所有可能导致错误的页面全部剥离并进行testing。

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

看到这个博客 (除下面)

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

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

这里的想法是,你可以在开发过程中将'customErrors'closures,当你想看到错误,然后启用它仅用于生产。

此MSDN文章进一步讨论属性。

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

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

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

使用这个简单的代码作为你的Error.aspx,它将解决这个问题(与CustomErrors = On一起)

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

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

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

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

例:

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

如果不使用defaultRedirect="Error"部分,则会在浏览器中产生500错误 – 而不是ASP.NET错误页面(YSOD)。

您也不必处于释放模式。 我testing了这个与debugging版本,它工作正常。

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

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

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

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


有时候(特别是当你使用类似Resharper的东西,打开你的文件时input他们的名字,而不是通过解决scheme资源pipe理器),你可以简单地从视图文件夹或甚至从另一个项目打开web.config。

注意:在我的情况下,我试图获得HandleError属性来捕获Controller构造函数内抛出的exception ! 当然,它不会抓住它。 HandleError属性只捕获Controller 操作中抛出的exception。 它就在MSDN页面(应该更加注意):

表示用于处理由操作方法抛出的exception的属性。

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

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

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

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