MVC 框架 - 异常处理
在 ASP.NET 中,错误处理是使用标准 try catch 方法或使用应用程序事件来完成的。ASP.NET MVC 使用称为异常过滤器的功能提供了对异常处理的内置支持。我们将在这里学习两种方法:一种是重写 onException 方法,另一种是定义 HandleError 过滤器。
重写 OnException 方法
当我们想要在控制器级别处理 Action 方法中的所有异常时,可以使用此方法。
要理解这种方法,请创建一个 MVC 应用程序(按照前面章节中介绍的步骤进行操作)。现在添加一个新的 Controller 类并添加以下代码,该代码重写 onException 方法并在我们的 Action 方法中显式抛出错误 -
现在让我们创建一个名为Error的通用视图,当应用程序中发生任何异常时,该视图将显示给用户。在 Views 文件夹中,创建一个名为 Shared 的新文件夹,并添加一个名为 Error 的新视图。
将以下代码复制到新创建的 Error.cshtml 中 -
如果您现在尝试运行该应用程序,它将给出以下结果。当此控制器内的任何操作方法发生任何异常时,上面的代码将呈现错误视图。
这种方法的优点是同一控制器内的多个操作可以共享此错误处理逻辑。然而,缺点是我们不能在多个控制器上使用相同的错误处理逻辑。
处理错误属性
HandleError 属性是我们在过滤器和操作过滤器一章中研究的操作过滤器之一。HandleErrorAttribute 是 IExceptionFilter 的默认实现。此过滤器处理控制器操作、过滤器和视图引发的所有异常。
要使用此功能,首先打开 web.config 中的 customErrors 部分。打开 web.config 并将以下代码放入 system.web 并将其值设置为 On。
<customErrors mode = "On"/>
我们已经在视图下的共享文件夹中创建了错误视图。这次将此视图文件的代码更改为以下内容,以使用 HandleErrorInfo 模型(位于 System.Web.MVC 下)对其进行强类型化。
@model System.Web.Mvc.HandleErrorInfo @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name = "viewport" content = "width = device-width" /> <title>Error</title> </head> <body> <h2> Sorry, an error occurred while processing your request. </h2> <h2>Exception details</h2> <p> Controller: @Model.ControllerName <br> Action: @Model.ActionName Exception: @Model.Exception </p> </body> </html>
现在将以下代码放入控制器文件中,该代码在控制器文件中指定 [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 可以在任何级别和跨控制器使用来处理此类错误。