【问题标题】:ErrorAttribute vs OnException vs Application_ErrorErrorAttribute vs OnException vs Application_Error
【发布时间】:2011-06-11 19:36:02
【问题描述】:

我想处理应用程序范围的错误并在 asp.net mvc 中显示 ErrorView 页面。 有 3 种方法可以做到(或者我知道)。

1) ErrorAttribute in BaseController:Controller class.
     Can be used on individual Action/Controller/BaseController.
2) Override OnException() in the BaseController:Controller class.
     Will work on Controllers derived from BaseController
3) Application_Error in Global_aspx.

最佳做法是什么。 这些方法中的哪一种应该用于应用程序范围的错误处理,或者我们应该使用多种还是只使用一种。

如果我们在 BaseController 上的 ErrorAttribute 或/和 OnException() 上处理错误,我们是否仍应在 Application_Error() 中处理它。

我们什么时候应该使用 Application_Error()?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 application-error onexception


    【解决方案1】:
    1. HandleErrorAttribute 是通过属性应用的 MVC 过滤器。如果发生异常,您可以提供要显示的视图名称,还可以指定此过滤器适用的基本(或特定)异常类型。如果没有提供视图名称,它将查找名为“错误”的视图。正如您已经注意到的,您可以将其应用于各种范围。它允许您根据异常指定不同的“错误页面”视图。

    2. Controller.OnException 是一种在您的任何操作最终引发错误时将被调用的方法。

    3. 以上两个都是 MVC 概念和 MVC 管道的一部分,它位于 ASP.NET 管道之上,如果您使用上述处理异常,它不会传播到 Application_Error ,但是像 http 错误 404、500 之类的东西,如果我没记错的话。

    用什么?

    一定要查看 ELMAH 以获取应用程序范围的错误日志记录以及我的 blog post 关于 ELMAH 和 ASP.NET MVC

    关于显示错误页面,您应该只使用[HandleError]HandleErrorAttribute 就可以了,因为它已经为您处理了所有事情(可选过滤和每个异常类型的可选自定义错误页面)。

    【讨论】:

    • 如果我有 HandleErrorAttribute 捕获 Exception 类,那不是防止所有“未处理的异常”吗?如果是这样,那不是阻止 Elmah 工作吗?
    • 是的,但是你可以有一个过滤器,它在通过 Elmah 记录异常但不处理或抑制它的所有内容之前运行 - stackoverflow.com/questions/766610/…
    • 最后一段一定是错的,或者我误解了什么。对于显示错误页面,只使用HandleErrorAttribute 好吗? ELMAH 不会对错误进行任何处理,它只是将其记录下来,并且对于HandleErrorAttribute,任何不是 500 或发生在控制器之外的错误都不会被处理。所以你还需要使用Application_Error
    • @wired_in 我只是提到了 ELMAH 用于错误记录而不是处理。另外你是对的,HandleErrorAttribute 不会捕获 ASP.NET 管道之外的错误。
    • @IvanZlatev 所以“关于显示错误页面,你应该可以只使用[HandleError]HandleErrorAttribute”需要修改吗?
    【解决方案2】:

    如果您想在应用程序级别处理错误,则不要为控制器应用 HandleError 或 OnException Override。

    尝试从 Application_Error 处理程序中的服务器对象获取最后一个错误检查异常类型并根据异常类型定义您要执行的操作。

    对于 404,您可能需要在控制器上设置不同的操作来处理。

    对于 500,您可能希望在控制器上设置不同的操作来处理。

    对于 NON HTTPException (SQLException),您甚至可能想要发送电子邮件。

    请确保为 SEO 设置正确的响应状态代码。

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 2011-09-18
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2010-12-09
      • 2017-06-20
      相关资源
      最近更新 更多