问题 MVC全局错误处理:Application_Error未触发


我试图在我的MVC应用程序中实现全局错误处理。

我内心有一些逻辑 Application_Error 重定向到 ErrorController 但它不起作用。

我的内心有一个突破点 Application_Error 方法中的 Global.aspx

当我强制异常时,断点没有被击中。有什么想法吗?


4271
2018-04-05 17:25


起源

您是否尝试在非调试模式下运行应用程序? CTR + F5 - Konstantin Tarkus
你的方法有正确的签名吗? Application_Error(对象发送者,EventArgs e)而不是Application_Error()? - Konstantin Tarkus
web.config中是否存在<customErrors mode =“Off”/>? - Konstantin Tarkus


答案:


您可以尝试这种方法进行测试:

protected void Application_Error(object sender, EventArgs e)
{
    var error = Server.GetLastError();
    Server.ClearError();
    Response.ContentType = "text/plain";
    Response.Write(error ?? (object) "unknown");
    Response.End();
}

Web.config文件

<customErrors mode="Off" />

10
2018-04-05 17:27



没有!这是一个糟糕的主意。我想要全局错误处理,记录错误并向用户呈现友好的屏幕。 - Dan
您的链接与我的问题无关。 - Dan
@Dan,你还没有明白我的观点。调试器无法进入您的Application_Error方法。使用我的代码没有调试器,你会发现它的工作原理。顺便说一句,你击败了任何有助于你的设计师。 - Konstantin Tarkus
对不起 - 我的注意力不在于冒犯,只是认为你的初步答案没有达到划痕\清楚。 - Dan
实际上是调试器 能够 进入Application_Error方法。


我认为更好的办法是使用 HandleErrorAttribute 装饰你的控制器(也许是一个基本控制器)。通过扩展此属性并修改它以满足您的需要,例如通过更改渲染的视图,这将使您可以选择在具有不同错误的不同控制器中执行日志记录或处理错误。使用此属性使用MVC中的标准过滤器处理,并使用视图构建页面,而不是像使用Application_Error那样直接写入响应。


2
2018-04-05 17:41



据我所知,使用HandleError属性对控制器外部发生的错误没有帮助(例如在Global.asax.cs中的RegisterRoutes中)。 - Michael Maddox
@Michael - 是的,它只适用于控制器或控制器方法,因为框架只识别那里的属性。在实践中,我发现这不是一个问题。对我来说,在动作之外运行的唯一代码是在启动时完成的。无论如何,我使用ELMAH和自定义HandleError属性,因此我的两个基础都被覆盖了。 - tvanfosson
@tvanfosson同样适用于ajax调用。如果你有它,它会直接进入global.asax application_error ...经过一些研究和测试后,我决定采用三方解决方案。 A.自定义属性使用RegisterGlobalFilters未装饰控制器B.更新web.config以打开C上的自定义错误处理.JavaScript捕获所有消息,使用模型和辅助方法或直接从ajax状态代码和重定向到错误通过javaScript页面,模型和ajax将其错误汇集到其中 - Clarence


我不能肯定地告诉你什么是错的,但是我可以想一些事情要检查......首先,VS是否打破了例外?如果您在调试器中,这是我认为的默认值。如果它只是点击F5,直到你得到断点的代码。此外,您确定在它到达之前的任何地方都没有处理异常 Application_Error

要检查的另一件事 - CustomErrors web.config中的模式,设置为 Off, 对?


0
2018-04-05 17:40



不要在其他地方处理它,我只是得到一个不合适的标准asp.net错误页面。 - Dan
好的,谢谢,给我的帖子添加了另一个想法。 - Steve Haigh