MVC 框架 - 异常处理



在 ASP.NET 中,错误处理是使用标准的 try catch 方法或使用应用程序事件来完成的。ASP.NET MVC 带有使用称为异常过滤器的功能来处理异常的内置支持。我们将在本文中学习两种方法:一种是重写 onException 方法,另一种是定义 HandleError 过滤器。

重写 OnException 方法

当我们想要在控制器级别处理所有操作方法中的异常时,可以使用此方法。

要了解此方法,请创建一个 MVC 应用程序(按照前面章节中介绍的步骤操作)。现在添加一个新的控制器类,并添加以下代码,该代码重写 onException 方法并在我们的操作方法中显式抛出错误:

MVC Exception Handling

现在让我们创建一个名为Error的通用视图,当应用程序中发生任何异常时,此视图将显示给用户。在 Views 文件夹内,创建一个名为 Shared 的新文件夹,并添加一个名为 Error 的新视图。

MVC Error Handling

将以下代码复制到新创建的 Error.cshtml 中:

MVC Exception Common View

如果您现在尝试运行应用程序,它将给出以下结果。上述代码在任何操作方法中发生任何异常时呈现 Error 视图。

MVC Common Exception Handling

这种方法的优点是同一个控制器中的多个操作可以共享此错误处理逻辑。但是,缺点是我们无法在多个控制器之间使用相同的错误处理逻辑。

HandleError 属性

HandleError 属性是我们之前在过滤器和操作过滤器章节中学习的操作过滤器之一。HandleErrorAttribute 是 IExceptionFilter 的默认实现。此过滤器处理控制器操作、过滤器和视图引发的所有异常。

要使用此功能,首先在 web.config 中打开 customErrors 部分。打开 web.config 并将以下代码放置在 system.web 内,并将它的值设置为 On。

<customErrors mode = "On"/>

我们已经在 Views 下的 Shared 文件夹中创建了 Error 视图。这次将此视图文件的代码更改为以下代码,以便使用 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(); 
      } 
   } 
}

如果您现在尝试运行应用程序,您将收到类似于以下屏幕截图中显示的错误。

MVC Exception

如您所见,这次错误包含有关控制器和操作相关详细信息的更多信息。通过这种方式,可以在任何级别和跨控制器使用 HandleError 来处理此类错误。

广告