ErrorAttribute vs OnException vs Application_Error

时间:2011-06-11 19:36:03

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

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

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()?

2 个答案:

答案 0 :(得分:11)

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

  2. Controller.OnException是一种方法,如果您的任何操作最终导致错误,将会调用此方法。

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

  4. 使用什么?

    绝对关注ELMAH的应用程序范围的错误记录以及关于ELMAH和ASP.NET MVC的blog post

    关于显示错误页面,只需使用Application_Error[HandleError]即可,因为它已经为您处理了所有内容(可选过滤和每个异常类型的可选自定义错误页面)。

答案 1 :(得分:0)

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

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

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

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

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

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