PlusMagi's Blog By Pitt Phunsanit Backend การจัดการ Error ใน Axios: การดักจับ HTTP Status (404, 500) ผ่าน Catch Block และ Response Status

การจัดการ Error ใน Axios: การดักจับ HTTP Status (404, 500) ผ่าน Catch Block และ Response Status

ในฐานะ Senior Architect การพัฒนาระบบที่เชื่อถือได้ (Resilient System) ไม่ได้วัดกันแค่ความสามารถในการทำงานเมื่อทุกอย่างเป็นปกติ แต่ต้องรวมถึงการจัดการสถานการณ์ล้มเหลวได้อย่างสง่างาม เมื่อแอปพลิเคชันของเรามีการสื่อสารกับบริการภายนอก (External APIs) หรือแม้แต่การเรียกใช้ข้อมูลที่ผิดพลาดภายในฐานข้อมูล การรับมือกับข้อผิดพลาดเหล่านี้อย่างมีระบบจึงสำคัญยิ่ง

ในโลกของ Backend Development โดยเฉพาะเมื่อเราต้องจัดการกับ API Calls ที่อาจส่งคืน HTTP Status Code ต่างๆ เช่น 404 (Not Found) หรือ 500 (Internal Server Error) เราจำเป็นต้องยกระดับการจัดการข้อผิดพลาดให้เหนือกว่าแค่การแสดงข้อความ ‘เกิดข้อผิดพลาด’ ทั่วไป แต่ต้องสามารถแยกแยะได้ว่าปัญหามาจากฝั่งไคลเอนต์ (Client-side, 4xx) หรือจากฝั่งเซิร์ฟเวอร์ (Server-side, 5xx) เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดีที่สุดและทีมพัฒนาสามารถแก้ไขจุดบกพร่องได้อย่างแม่นยำ

💡 หลักการจัดการ Error Status Code ใน PostgreSQL

แม้ว่า Axios จะเป็นไลบรารี JavaScript แต่หลักการทางสถาปัตยกรรมของการตรวจสอบสถานะ (Status Checking) นั้นใช้ได้กับทุก Backend Stack และเราสามารถจำลองกระบวนการนี้ใน PostgreSQL ได้อย่างมีประสิทธิภาพ โดยเฉพาะเมื่อข้อมูล Error ถูกส่งมาในรูปแบบ JSONB ซึ่งเป็นมาตรฐานในการสื่อสาร API สมัยใหม่

หัวใจสำคัญคือการใช้ฟังก์ชันของ PostgreSQL เช่น jsonb operators, CASE WHEN statements และ Common Table Expressions (CTE) เพื่อจำลองกระบวนการ ‘ดักจับ’ และ ‘วิเคราะห์’ สถานะข้อผิดพลาดที่เข้ามา แทนที่จะพึ่งพาแค่บล็อก try...catch ทั่วไป

🛠️ ตัวอย่าง: การตรวจสอบสถานะ Error Code จาก JSONB Payload

สมมติว่าเราได้รับ payload ของข้อผิดพลาดจาก API ซึ่งมีโครงสร้างเป็น JSONB ที่ระบุ Status และ Message เราสามารถใช้ PostgreSQL เพื่อแยกแยะและจัดประเภทของข้อผิดพลาดได้อย่างแม่นยำ:

SQL

WITH api_error AS ( -- จำลองการรับ Payload Error จากภายนอก API Call ภายนอก -- SELECT '{"status": 404, "message": "Resource not found", "details": "User ID does not exist"}'::jsonb AS error_payload ) 
SELECT
    CASE
        -- ตรวจสอบสถานะ 4xx (Client Error)
        WHEN (error_payload ->> 'status')::int >= 400 AND (error_payload ->> 'status')::int < 500 THEN
            'CLIENT ERROR (4XX): ข้อมูลที่ร้องขอไม่มีอยู่จริง กรุณาตรวจสอบ Input.'
        -- ตรวจสอบสถานะ 5xx (Server Error)
        WHEN (error_payload ->> 'status')::int >= 500 AND (error_payload ->> 'status')::int < 600 THEN
            'SERVER ERROR (5XX): เกิดข้อผิดพลาดที่เซิร์ฟเวอร์ โปรดลองใหม่อีกครั้งภายหลัง.'
        -- กรณีอื่นๆ ที่ไม่เข้าข่าย Error Code มาตรฐาน
        ELSE
            'UNKNOWN ERROR: ไม่สามารถระบุประเภทของข้อผิดพลาดได้.'
    END AS error_classification,
    error_payload ->> 'message' AS user_friendly_message;

🚀 การยกระดับสู่ระดับ Senior Architect: Global Interceptors และ Logging

ในทางปฏิบัติจริง เราไม่ควรเขียน Logic การตรวจสอบ Error ซ้ำๆ กันทุกครั้ง (Repetitive Code) แนวคิดของ ‘Global Interceptor’ ใน Axios สามารถถูกจำลองได้ด้วยการสร้าง PostgreSQL Function หรือ Trigger ที่ทำหน้าที่เป็นจุดรวมในการจัดการข้อผิดพลาดทั้งหมด

ฟังก์ชันนี้ควรมีหน้าที่หลัก 2 อย่าง:

  1. Centralized Logging: บันทึกรายละเอียดของ Error ทั้งหมด (Status Code, Payload, Timestamp) ลงในตาราง Log เฉพาะ เพื่อให้ทีม Monitoring สามารถตรวจสอบย้อนหลังได้ทันที
  2. Retry Mechanism: หากพบ Status 503 (Service Unavailable) ระบบควรมี Logic ในการรอและลองเรียก API นั้นซ้ำโดยอัตโนมัติ (Exponential Backoff) ก่อนที่จะแจ้งข้อผิดพลาดไปยังผู้ใช้

การจัดการ Error ที่เป็นระบบระเบียบเช่นนี้ ไม่เพียงแต่ทำให้โค้ดของเรามีความแข็งแกร่ง (Resilient) เท่านั้น แต่ยังแสดงให้เห็นถึงความเข้าใจในสถาปัตยกรรมซอฟต์แวร์ที่สมบูรณ์แบบ ซึ่งเป็นทักษะสำคัญของวิศวกรระดับอาวุโส

✅ สรุปและข้อควรจำ

การจัดการ Error Code 4xx และ 5xx อย่างถูกต้อง ไม่ใช่แค่การเขียน IF/ELSE แต่คือการออกแบบ Flow Control ที่รอบคอบ การใช้ PostgreSQL ในลักษณะนี้ช่วยให้เราสามารถวิเคราะห์ข้อมูลที่ซับซ้อน (JSONB) เพื่อแยกแยะประเภทของปัญหาได้อย่างเป็นระบบ ทำให้ผลิตภัณฑ์ของเรามีความน่าเชื่อถือและประสบการณ์ผู้ใช้ราบรื่นแม้ในยามเกิดข้อผิดพลาด

Exit mobile version