【问题标题】:MVC Global error handling: Application_Error not firingMVC 全局错误处理:Application_Error 未触发
【发布时间】:2010-10-17 16:29:46
【问题描述】:

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

我的Application_Error 中有一些逻辑重定向到ErrorController,但它不起作用。

我在Global.aspxApplication_Error 方法中有一个断点。

当我强制异常时,没有命中断点。任何想法为什么?

【问题讨论】:

  • 您是否尝试过在非调试模式下运行应用程序?点击+F5
  • 你的方法有正确的签名吗? Application_Error(object sender, EventArgs e) 而不是 Application_Error() ?
  • 是否存在于您的 web.config 中?

标签: c# asp.net-mvc error-handling


【解决方案1】:

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

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" />

【讨论】:

  • 不!那是个坏主意。我想要全局错误处理,记录错误并向用户呈现一个友好的屏幕。
  • 您的链接与我的问题并不真正相关。
  • @Dan,你没有明白我的意思。调试器无法进入您的 Application_Error 方法。在没有调试器的情况下使用我的代码,你会发现它可以工作。顺便说一句,你击败了任何想要帮助你的人。
  • 抱歉,我不是故意冒犯的,只是觉得你最初的回答不符合标准\clear。
  • 实际上调试器CAN进入Application_Error方法。
【解决方案2】:

我不能肯定地告诉你出了什么问题,但我可以想到几件事来检查......首先,VS 是否因异常而中断?如果您在调试器中,这是我认为的默认设置。如果它只是按 F5 直到您使用断点到达您的代码。另外,您确定在异常到达Application_Error 之前没有在任何地方处理异常吗?

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

【讨论】:

  • 不,别在别处处理它,我只是得到一个不优雅的标准 asp.net 错误页面。
【解决方案3】:

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

【讨论】:

  • 据我所知,使用 HandleError 属性并不能解决控制器外部发生的错误(例如在 Global.asax.cs 中的 RegisterRoutes 中)。
  • @Michael - 是的,它仅适用于控制器或控制器方法,因为框架仅识别那里的属性。在实践中,我认为这不是问题。对我来说,唯一在动作之外运行的代码是在启动时完成的。无论如何,我使用带有自定义 HandleError 属性的 ELMAH,所以我的两个基础都被覆盖了。
  • @tvanfosson 同样适用于 ajax 调用。如果你有它,它会直接进入 global.asax application_error……经过一些研究和测试,我决定采用三管齐下的解决方案。 A. 使用 RegisterGlobalFilters 的自定义属性未修饰控制器 B. 更新 web.config 以打开自定义错误处理 C. 捕获所有消息的 JavaScript,使用模型和辅助方法或直接从 ajax 状态代码和重定向到错误通过 javaScript 的页面,模型和 ajax 将它们的错误汇集到
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2016-11-12
  • 2011-06-30
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多