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 來處理此類錯誤。

廣告