MVC Framework - การจัดการข้อยกเว้น

ใน ASP.NET การจัดการข้อผิดพลาดทำได้โดยใช้วิธีการลองจับมาตรฐานหรือใช้เหตุการณ์ของแอปพลิเคชัน ASP.NET MVC มาพร้อมกับการสนับสนุนในตัวสำหรับการจัดการข้อยกเว้นโดยใช้คุณลักษณะที่เรียกว่าตัวกรองข้อยกเว้น เราจะเรียนรู้สองวิธีที่นี่: วิธีหนึ่งที่มีการแทนที่เมธอด onException และอีกวิธีหนึ่งโดยการกำหนดตัวกรอง HandleError

แทนที่วิธี OnException

วิธีนี้ใช้เมื่อเราต้องการจัดการข้อยกเว้นทั้งหมดในวิธีการดำเนินการในระดับคอนโทรลเลอร์

เพื่อทำความเข้าใจแนวทางนี้ให้สร้างแอปพลิเคชัน MVC (ทำตามขั้นตอนที่กล่าวถึงในบทก่อนหน้า) ตอนนี้เพิ่มคลาส Controller ใหม่และเพิ่มโค้ดต่อไปนี้ซึ่งจะแทนที่เมธอด onException และแสดงข้อผิดพลาดอย่างชัดเจนในวิธีการดำเนินการของเรา -

ตอนนี้ให้เราสร้างมุมมองทั่วไปที่ชื่อ Errorซึ่งจะแสดงให้ผู้ใช้เห็นเมื่อมีข้อยกเว้นเกิดขึ้นในแอปพลิเคชัน ภายในโฟลเดอร์ Views ให้สร้างโฟลเดอร์ใหม่ชื่อ Shared และเพิ่ม View ใหม่ชื่อ Error

คัดลอกรหัสต่อไปนี้ภายใน Error.cshtml ที่สร้างขึ้นใหม่ -

หากคุณพยายามเรียกใช้แอปพลิเคชันตอนนี้แอปพลิเคชันจะให้ผลลัพธ์ดังต่อไปนี้ โค้ดด้านบนแสดง Error View เมื่อมีข้อยกเว้นเกิดขึ้นในวิธีการดำเนินการใด ๆ ภายในตัวควบคุมนี้

ข้อดีของแนวทางนี้คือการดำเนินการหลายอย่างภายในตัวควบคุมเดียวกันสามารถใช้ตรรกะการจัดการข้อผิดพลาดนี้ร่วมกันได้ อย่างไรก็ตามข้อเสียคือเราไม่สามารถใช้ตรรกะการจัดการข้อผิดพลาดเดียวกันกับคอนโทรลเลอร์หลายตัวได้

คุณสมบัติ HandleError

แอตทริบิวต์ HandleError เป็นหนึ่งในตัวกรองการดำเนินการที่เราศึกษาในบทฟิลเตอร์และฟิลเตอร์การดำเนินการ HandleErrorAttribute คือการนำไปใช้งานเริ่มต้นของ IExceptionFilter ตัวกรองนี้จัดการข้อยกเว้นทั้งหมดที่เกิดขึ้นจากการกระทำของตัวควบคุมตัวกรองและมุมมอง

ในการใช้คุณสมบัตินี้ก่อนอื่นให้เปิดส่วน customErrors ใน web.config เปิด web.config และวางโค้ดต่อไปนี้ภายใน system.web และตั้งค่าเป็น On

<customErrors mode = "On"/>

เราได้สร้างมุมมองข้อผิดพลาดไว้แล้วภายในโฟลเดอร์ที่ใช้ร่วมกันภายใต้มุมมอง คราวนี้เปลี่ยนรหัสของไฟล์ View นี้เป็นดังต่อไปนี้เพื่อพิมพ์อย่างมากด้วยโมเดล 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] ที่ไฟล์ Controller

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

หากคุณพยายามเรียกใช้แอปพลิเคชันตอนนี้คุณจะได้รับข้อผิดพลาดคล้ายกับที่แสดงในภาพหน้าจอต่อไปนี้

อย่างที่คุณเห็นข้อผิดพลาดในครั้งนี้มีข้อมูลเพิ่มเติมเกี่ยวกับรายละเอียดที่เกี่ยวข้องกับคอนโทรลเลอร์และการดำเนินการ ในลักษณะนี้ HandleError สามารถใช้ในระดับใดก็ได้และข้ามตัวควบคุมเพื่อจัดการกับข้อผิดพลาดดังกล่าว