【问题标题】:MVC HandleError filter didn't catch an exceptionMVC HandleError 过滤器没有捕捉到异常
【发布时间】:2012-08-24 09:37:18
【问题描述】:

我有一个 MVC 3 Web 应用程序,我在其中使用“HandleError”操作过滤器进行异常处理。我的这个动作过滤器实现如下:

[HandleError]
public class BaseController : Controller {...}

这是派生我所有控制器的基类。在我的 web.config 中,我有 并且我的共享文件夹中有一个 Error.cshtml(.cshtml 因为我使用 Razor)。一切正常,我得到了很好的异常处理(由我的函数格式化)

最近,不知何故,我得到了“未处理的异常 (YSOD)”,并且由于“customErrors”,我得到了默认的 ASP.Net 错误消息,其中没有关于实际异常的任何信息。这发生在 AJAX 回帖中。但是,我无法重现它。

任何类型的错误都可能逃脱此操作过滤器吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 exception-handling handleerror


    【解决方案1】:

    任何类型的错误都可能逃脱此操作过滤器吗?

    HandleError 过滤器不会捕获应用程序中触发的所有异常。它可以捕获在动作、动作过滤器中触发的异常......只是在 MVC 上下文中。此外,它不会捕获状态代码不是 500 的 HTTP 异常。仅依赖于 MVC 应用程序中的 HandleError 过滤器是一个坏主意。

    您仍然应该依靠Application_Error 事件来进行一些日志记录,并依靠customErrors 部分来为HandleError 未捕获的异常显示自定义错误页面。

    我已经写了一篇关于这个主题的博客post,可能会对你有所帮助。

    【讨论】:

    • 马克,抱歉迟到了。是的,我遇到了一些异常,例如“UnauthorizedAccessException”(可能是恶意文件访问)。我同意 Application_Error 可能是捕捉它的最后阶段。但是,[HandleError] 更像是 MVC - 这篇文章(stackoverflow.com/questions/183316/asp-net-mvc-handleerror - 第三个答案)怎么样,它允许捕获此类异常。 ELMAH 似乎适合记录日志。
    • 我昨天尝试了您的 Application_Error 代码,但它无法处理“UnauthorizedAccessException”。后来我将代码更改为 controller.ViewData.Model = new HandleErrorInfo(ex, currentController, currentAction); - 有效!我想知道这是否与 [HandleError] 共存,或者您会说在 Application_error 之后不再需要 [HandleError]。
    • 应该是controller.ViewData.Model = new HandleErrorInfo()
    • 在我标记你的答案之前,我只是想确认这是否是最好的手段?我的意思是,如果它只是设置状态代码,或者 Application_Error 是错误会发生的确定位置。最后一件事 - 希望它可以与 ELMAH 并行工作(用于日志记录)
    • 与 HandleError 相比,我会说 Application_Error 是一个更好的选择。这不是关于设置状态代码,而是关于捕获应用程序中创建的所有异常。如果您要使用 ELMAH,那么我不认为您为什么要使用 Application_Error,因为 ELMAH 将处理所有未处理的异常并记录它们。与 Application_Error 相比,我可能会建议 ELMAH,但唯一的问题是您想弄清楚如何为不同的错误返回不同的视图(可能是 customErrors)。
    猜你喜欢
    • 2010-10-11
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2015-11-21
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多