Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีสร้าง Exception Filter จัดการ Exception ที่ไม่ได้ Handle ใน C# ASP.NET WebAPI

Exception Filter จะทำงานเมื่อ Controller Method โยน Exception ที่ไม่ได้จัดการ และไม่ใช่ HttpResponseException (ซึ่งถูกออกแบบมาเพื่อส่ง HTTP Response กลับโดยตรง)

Exception Filter implement interface IExceptionFilter วิธีง่ายสุดคือสืบทอดจาก ExceptionFilterAttribute และ Override เมธอด OnException

ตัวอย่าง Exception Filter

using System;
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;

namespace DemoWebApplication.Controllers
{
    public class ExceptionAttribute : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if (context.Exception is NotFiniteNumberException)
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.RequestedRangeNotSatisfiable);
            }
        }
    }
}

การใช้งานใน Controller

using DemoWebApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace DemoWebApplication.Controllers
{
    [Exception]
    public class StudentController : ApiController
    {
        List students = new List
        {
            new Student { Id = 1, Name = "Mark" },
            new Student { Id = 2, Name = "John" }
        };

        public Student Get(int id)
        {
            if (id <= 0)
            {
                throw new NotFiniteNumberException("The Id is not valid");
            }
            return students.FirstOrDefault(x => x.Id == id);
        }
    }
}

ทดสอบโดยส่ง id = 0 จะได้ HTTP 416:

วิธีสร้าง Exception Filter จัดการ Exception ที่ไม่ได้ Handle ใน C# ASP.NET WebAPI

วิธีการลงทะเบียน Exception Filter

  • ระดับ Action: [Exception] public IHttpActionResult Get(int id) { ... }
  • ระดับ Controller: [Exception] public class StudentController : ApiController { ... }
  • ระดับ Global (WebApiConfig.cs):
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Filters.Add(new ExceptionAttribute());
        }
    }