我想处理应用程序范围内的错误,并在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或/And OnException()上处理错误,我们是否仍应在Application_error()中处理它。
我们应该在什么时候使用Application_Error()?
-
CCD_ 1是经由属性应用的MVC过滤器。如果发生异常,您可以提供要显示的视图名称,还可以指定此筛选器应用的基本(或特定)异常类型。如果未提供视图名称,它将查找名为"错误"的视图。正如您已经注意到的,您可以将其应用于各种范围。它允许您根据异常指定不同的"错误页面"视图。
-
Controller.OnException
是一个方法,如果您的任何操作最终引发错误,就会调用它。 -
上面两个都是MVC概念,也是MVC管道的一部分,MVC管道位于ASP.NET管道的顶部,如果使用上面的方法处理异常,它不会传播到
Application_Error
,但会传播到http错误404500,如果我没记错的话。
使用什么?
一定要查看ELMAH中的应用程序范围错误日志,以及我关于ELMAH和ASP.NET MVC 的博客文章
关于显示错误页面,您应该只使用[HandleError]
和HandleErrorAttribute
就可以了,因为它已经为您处理了所有事情(可选的过滤和每个异常类型的可选自定义错误页面)。
如果您想在应用程序级别处理错误,那么不要对控制器应用HandleError或OnException Override。
尝试从Application_Error Handler中的服务器对象获取最后一个错误检查异常类型,并根据异常类型定义要执行的操作。
对于404,您可能需要在控制器上设置一个不同的操作来处理
对于500,您可能需要在控制器上设置一个不同的操作来处理
对于NON-HTTPException(SQLException),您甚至可能想要发送电子邮件
请确保您为SEO目的设置了正确的响应状态代码。