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 – 查看三个不同的来源
- web.config的<deployment>部分的零售属性。 这是将应用程序部署到生产服务器时设置的有用属性。 这会覆盖自定义错误的任何其他设置。
- web.config的<customErrors>部分的模式属性。 此设置指示自定义错误是否已启用,如果已启用,是否仅为远程请求启用自定义错误。
- 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>