我想处理应用程序范围错误并在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()?
答案 0 :(得分:11)
HandleErrorAttribute
是通过该属性应用的MVC过滤器。如果发生异常,您可以提供要显示的视图名称,还可以指定此过滤器适用的基本(或特定)异常类型。如果没有提供视图名称,它将查找名为“Error”的视图。正如您已经注意到的那样,您可以将它应用于各种范围。它允许您根据异常指定不同的“错误页面”视图。
Controller.OnException
是一种方法,如果您的任何操作最终导致错误,将会调用此方法。
以上两个都是MVC概念和MVC管道的一部分,它位于ASP.NET管道之上,如果使用上面的方法处理异常,它将不会传播到{{1但是,像http错误404,500这样的东西,如果我没记错的话。
使用什么?
绝对关注ELMAH的应用程序范围的错误记录以及关于ELMAH和ASP.NET MVC的blog post
关于显示错误页面,只需使用Application_Error
和[HandleError]
即可,因为它已经为您处理了所有内容(可选过滤和每个异常类型的可选自定义错误页面)。
答案 1 :(得分:0)
如果要在应用程序级别处理错误,则不要对控制器应用HandleError或OnException Override。
尝试从Application_Error中的服务器对象获取最后一个错误处理程序检查异常类型,并根据异常类型定义您要执行的操作。
对于404,您可能希望在控制器上设置不同的操作来处理。
对于500,您可能希望在控制器上设置不同的操作来处理。
对于NON HTTPException(SQLException),您甚至可能希望发送电子邮件。
请确保为SEO目的设置正确的响应状态代码。