【问题标题】:Application_Error() doesn't fireApplication_Error() 不会触发
【发布时间】:2018-08-31 19:41:59
【问题描述】:

我有一个 MVC 5 应用程序,我正在尝试捕获任何未捕获的错误。为此,我在 Global.asax.cs 中创建了一个方法,如下所示:

protected void Application_Error()
{
    MyLogger.Log("some text");
}

当我在本地运行项目时,会针对 404、500 等触发此方法。但是,当我将应用程序切换到 Release 并将其放在服务器上时,它会处理 404,但不再处理 500。我创建了一个方法来抛出这样的错误:

[HttpGet]
[AllowAnonymous]
public string Error()
{
    var s = int.Parse("hello abc 123");

    return "Hello World";
}

该方法当然会崩溃,因为它无法将文本转换为 int,但 Application_Error() 不会触发。如果我尝试访问一个不存在的页面,它会触发并且我可以在日志中看到它。

我查看了 web.config,在生产中这是设置:

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

另外,在 filter.config 我有:

filters.Add(new HandleErrorAttribute());

如果我在上面评论该行,我的 Application_Error 将激活并且我可以看到日志。但是,该页面不再重定向到我的自定义错误页面。相反,我得到一个带有以下消息的白屏:

由于发生内部服务器错误,页面无法显示。

我的问题是:

当我使用上述 web.config 设置将网站投入生产时,为什么网站停止处理 404 错误。如何让它捕获这些错误?

编辑:我将问题归结为:如果我注释掉 HandleError 属性,那么我的 Application_Error() 方法就会触发。如果我把它放回去,它不会。在我的本地机器上它总是工作,当我把它推到天蓝色时,它停止工作。

【问题讨论】:

  • 为什么不简单地生成一个错误: throw new Exception(...)
  • 如果您在服务器上使用浏览器,即在本地,您将获得更多的调试输出

标签: c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

HandleError 属性将触发,因此 Application_Error 不会。由于 HandleException 是 MVC 管道的一部分,它将处理错误并防止它被抛出。这对我来说在本地工作的原因是我在 web.config 中有debug="off"

所以我的解决方案是要么不使用 HandleError 异常,要么编写一个自定义的扩展和日志。

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2012-04-17
    • 1970-01-01
    • 2016-11-12
    • 2011-06-30
    • 2011-04-12
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多