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 สามารถใช้ในระดับใดก็ได้และข้ามตัวควบคุมเพื่อจัดการกับข้อผิดพลาดดังกล่าว