MVC Framework - Xử lý ngoại lệ

Trong ASP.NET, việc xử lý lỗi được thực hiện bằng cách sử dụng phương pháp tiếp cận try catch tiêu chuẩn hoặc sử dụng các sự kiện ứng dụng. ASP.NET MVC đi kèm với hỗ trợ tích hợp để xử lý ngoại lệ bằng cách sử dụng một tính năng được gọi là bộ lọc ngoại lệ. Chúng ta sẽ tìm hiểu hai cách tiếp cận ở đây: một bằng cách ghi đè phương thức onException và một cách khác bằng cách xác định bộ lọc HandleError.

Ghi đè phương thức OnException

Cách tiếp cận này được sử dụng khi chúng ta muốn xử lý tất cả các ngoại lệ trên các phương thức Hành động ở cấp bộ điều khiển.

Để hiểu cách tiếp cận này, hãy tạo một ứng dụng MVC (làm theo các bước được trình bày trong các chương trước). Bây giờ, hãy thêm một lớp Bộ điều khiển mới và thêm đoạn mã sau để ghi đè phương thức onException và thông báo lỗi rõ ràng trong phương thức Hành động của chúng tôi -

Bây giờ chúng ta hãy tạo một View chung có tên Errorsẽ được hiển thị cho người dùng khi có bất kỳ ngoại lệ nào xảy ra trong ứng dụng. Bên trong thư mục Chế độ xem, tạo một thư mục mới có tên Được chia sẻ và thêm Chế độ xem mới có tên Lỗi.

Sao chép mã sau bên trong Error.cshtml mới được tạo -

Nếu bạn thử chạy ứng dụng ngay bây giờ, nó sẽ cho kết quả như sau. Đoạn mã trên hiển thị Dạng xem Lỗi khi bất kỳ ngoại lệ nào xảy ra trong bất kỳ phương thức hành động nào trong bộ điều khiển này.

Ưu điểm của phương pháp này là nhiều hành động trong cùng một bộ điều khiển có thể chia sẻ logic xử lý lỗi này. Tuy nhiên, nhược điểm là chúng ta không thể sử dụng cùng một logic xử lý lỗi trên nhiều bộ điều khiển.

Thuộc tính HandleError

Thuộc tính HandleError là một trong những bộ lọc hành động mà chúng ta đã nghiên cứu trong chương Bộ lọc và Bộ lọc hành động. HandleErrorAttribute là cài đặt mặc định của IExceptionFilter. Bộ lọc này xử lý tất cả các ngoại lệ được đưa ra bởi các hành động, bộ lọc và chế độ xem của bộ điều khiển.

Để sử dụng tính năng này, trước hết hãy bật phần customErrors trong web.config. Mở web.config và đặt mã sau vào system.web và đặt giá trị của nó là Bật.

<customErrors mode = "On"/>

Chúng tôi đã tạo Chế độ xem Lỗi bên trong thư mục Chia sẻ trong Chế độ xem. Lần này, hãy thay đổi mã của tệp Chế độ xem này thành mã sau, để nhập mạnh mã đó bằng mô hình HandleErrorInfo (có trong 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>

Bây giờ hãy đặt mã sau vào tệp bộ điều khiển của bạn, mã này chỉ định thuộc tính [HandleError] tại tệp Bộ điều khiển.

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(); 
      } 
   } 
}

Nếu bạn cố gắng chạy ứng dụng ngay bây giờ, bạn sẽ gặp lỗi tương tự như trong ảnh chụp màn hình sau.

Như bạn có thể thấy, lỗi lần này chứa thêm thông tin về các chi tiết liên quan đến Bộ điều khiển và Hành động. Theo cách này, HandleError có thể được sử dụng ở bất kỳ cấp độ nào và trên các bộ điều khiển để xử lý các lỗi như vậy.