2011-06-11 87 views
15

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

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

回答

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

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

  3. 上述两者都是MVC概念和MVC管道的一部分,它位于ASP.NET管道之上,如果使用上述方法处理异常,它将不会传播到Application_Error,而是像http错误404,500,如果我没有记错的话。

要使用什么?

绝对看看ELMAH应用广泛的错误记录和我的blog post约ELMAH和ASP.NET MVC

关于你应该罚款只使用[HandleError]HandleErrorAttribute显示错误页面,因为它已经为你处理一切(可选筛选和每个异常类型的可选自定义错误页面)。

+0

如果我有HandleErrorAttribute捕获Exception类,是不是阻止了所有“未处理的异常?”如果是这样,这不妨碍Elmah的工作? – 2012-05-15 23:24:51

+0

是的,但是你可以有一个过滤器在所有通过Elmah记录异常之前运行,但不处理它或禁止它 - http://stackoverflow.com/questions/766610/how-to-get-elmah-用asp-net-mvc-handleerror-attribute/5936867#5936867 – 2012-05-16 11:11:21

+0

最后一段必须是错误的,或者我误解了某些东西。为了显示错误页面,只需使用'HandleErrorAttribute'就可以了? ELMAH没有为处理错误做任何事情,它只是记录它,并且使用'HandleErrorAttribute',任何不是500或者在控制器之外发生的错误都不会被处理。所以你也需要使用'Application_Error'。 – 2014-02-23 22:47:22

0

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

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

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

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

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

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

相关问题