在ASP.NET中,使用标准try catch方法或使用应用程序事件来完成错误处理. ASP.NET MVC内置了对异常处理的支持,使用称为异常过滤器的功能.我们将在这里学习两种方法:一种是覆盖onException方法,另一种是通过定义HandleError过滤器.
覆盖OnException方法
这种方法当我们想要在控制器级别处理Action方法的所有异常时使用.
要理解这种方法,请创建一个MVC应用程序(按照前面章节中介绍的步骤).现在添加一个新的Controller类并添加以下代码覆盖onException方法并在Action方法中显式抛出错误 :
现在让我们创建一个名为错误的公共视图,当应用程序中发生任何异常时,该视图将显示给用户.在Views文件夹中,创建一个名为Shared的新文件夹,并添加一个名为Error的新视图.
将以下代码复制到新创建的Error.cshtml :
如果您现在尝试运行该应用程序,它将给出以下结果.当控制器中的任何操作方法发生任何异常时,上面的代码会呈现错误视图.
此方法的优点是同一控制器中的多个操作可以共享此错误处理逻辑.但是,缺点是我们不能在多个控制器上使用相同的错误处理逻辑.
HandleError属性
HandleError属性是其中一个动作我们在过滤器和动作过滤器一章中研究过滤器. HandleErrorAttribute是IExceptionFilter的默认实现.此过滤器处理控制器操作,过滤器和视图引发的所有异常.
要使用此功能,首先打开web.config中的customErrors部分.打开web.config并将以下代码放在system.web中并将其值设置为On.
我们已经在Views下的Shared文件夹中创建了错误视图.这次将此View文件的代码更改为以下内容,以使用HandleErrorInfo模型(存在于System.Web.MVC下)对其进行强类型化.
@model System.Web.Mvc.HandleErrorInfo @{ Layout = null; }Error Sorry, an error occurred while processing your request.
Exception details
Controller: @Model.ControllerName
Action: @Model.ActionName Exception: @Model.Exception
现在将以下代码放在控制器文件中,该文件指定Controller文件中的[HandleError]属性.
using System; using System.Data.Common; using System.Web.Mvc; namespace ExceptionHandlingMVC.Controllers { [HandleError] public class ExceptionHandlingController : Controller { public ActionResult TestMethod() { throw new Exception("Test Exception"); return View(); } } }
如果您现在尝试运行该应用程序,您将收到类似于显示的错误在下面的屏幕截图中.
如您所见,这次错误包含有关Controller和Action相关细节的更多信息.通过这种方式,可以在任何级别和控制器之间使用HandleError来处理此类错误.