16

我想处理应用程序范围的错误并在 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()?

4

2 回答 2

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

  2. Controller.OnException如果您的任何操作最终引发错误,该方法将被调用。

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

用什么?

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

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

于 2011-06-11T21:15:09.487 回答
0

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

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

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

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

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

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

于 2011-06-12T07:08:50.617 回答