วัน: 2 มีนาคม 2012

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

ในโลกของการพัฒนาแอปพลิเคชันที่ต้องพึ่งพาการสื่อสารผ่าน API อย่างต่อเนื่อง ความเสถียรและความน่าเชื่อถือของระบบจึงขึ้นอยู่กับความสามารถในการจัดการสถานการณ์ที่ไม่คาดฝัน การเรียกใช้ข้อมูลจากเซิร์ฟเวอร์อาจไม่เป็นไปตามแผนเสมอไป ไม่ว่าจะเป็นปัญหาเครือข่าย ข้อมูลที่ร้องขอไม่มีอยู่จริง หรือแม้แต่ข้อผิดพลาดทางฝั่งเซิร์ฟเวอร์ การเตรียมพร้อมรับมือกับ “ความล้มเหลว” เหล่านี้อย่างมีระบบจึงไม่ใช่แค่การเขียนโค้ด แต่คือการสร้างประสบการณ์ผู้ใช้ (UX) ที่ราบรื่นและเชื่อถือได้


เจาะลึกรายละเอียดและประเด็นสำคัญ

เมื่อเราใช้ไลบรารีอย่าง Axios ในการเรียก API การจัดการ Error ที่ถูกต้องไม่ได้หมายถึงแค่การจับ `try…catch` ทั่วไป เพราะแม้ว่า Promise จะถูก Reject เมื่อเกิดปัญหาเครือข่าย แต่สำหรับ HTTP Status Code เช่น 404 (Not Found) หรือ 500 (Internal Server Error) โดยค่าเริ่มต้น Axios อาจจะยังคง Resolve Promise อยู่ ทำให้เราต้องเข้าถึงสถานะของข้อผิดพลาดผ่านอ็อบเจกต์ `error` ที่ถูกส่งมาในบล็อก `.catch()` อย่างถูกต้อง

หัวใจสำคัญของการจัดการ Error ในระดับนี้คือการตรวจสอบคุณสมบัติ (property) ภายในอ็อบเจกต์ข้อผิดพลาด โดยเฉพาะ `error.response`. หากเซิร์ฟเวอร์ตอบกลับมาด้วย Status Code ใดๆ ข้อมูลเหล่านั้นจะถูกบรรจุอยู่ในส่วนนี้ ทำให้เราสามารถใช้เงื่อนไข (conditional logic) เพื่อแยกแยะได้ว่าปัญหาเกิดจากฝั่งไคลเอนต์ (4xx) หรือฝั่งเซิร์ฟเวอร์ (5xx) ซึ่งเป็นแนวทางที่เหนือกว่าการแค่แสดงข้อความ “เกิดข้อผิดพลาด” ทั่วไป

const axios = require('axios');

async function fetchData(url) {
  try {
    // 1. การเรียก API ปกติ
    const response = await axios.get(url);
    console.log("Success:", response.data);
  } catch (error) {
    // 2. การดักจับ Error ที่นี่
    if (error.response) {
      let status = error.response.status;

      if (status === 404) {
        console.error("Error 404: Resource not found. กรุณาตรวจสอบ URL.");
        // แสดงข้อความเฉพาะสำหรับผู้ใช้ว่าข้อมูลไม่มีอยู่จริง
      } else if (status >= 500) {
        console.error(`Error ${status}: Server error. โปรดลองใหม่อีกครั้งภายหลัง.`);
        // แจ้งให้ผู้ใช้ทราบว่าเป็นปัญหาที่เซิร์ฟเวอร์
      } else {
        console.error(`HTTP Error ${status}: ${error.response.data}`);
      }
    } else if (error.request) {
      // กรณีไม่มีการตอบกลับจากเซิร์ฟเวอร์เลย (เช่น ออฟไลน์)
      console.error("Network Error: ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้");
    } else {
      // ข้อผิดพลาดอื่นๆ เช่น การตั้งค่า Axios ผิด
      console.error("Unknown Error:", error.message);
    }
  }
}

fetchData('https://api.example.com/data');


การนำไปประยุกต์ใช้ในชีวิตและการทำงานยุคใหม่

  • การออกแบบ User Experience (UX) ที่ชาญฉลาด: แทนที่จะแสดงข้อความ Error Code ให้ผู้ใช้เห็นโดยตรง เราควรแปลง Status Code เหล่านั้นให้เป็นภาษาที่เข้าใจง่าย เช่น หากเจอ 401 ควรแจ้งว่า “คุณต้องเข้าสู่ระบบเพื่อดูข้อมูลนี้” ไม่ใช่แค่ “Unauthorized” การจัดการ Error จึงรวมถึงการควบคุมสิ่งที่ผู้ใช้มองเห็นด้วย
  • การสร้าง Global Interceptors สำหรับ Logging และ Retry: ในระดับ Senior Developer เราไม่ควรจัดการ Error ซ้ำๆ กันในทุกฟังก์ชัน ควรใช้ Axios Interceptor เพื่อดักจับ Error ระดับสูง (Global) เช่น การบันทึกรายละเอียดของข้อผิดพลาดทั้งหมดไปยังระบบ Monitoring (Sentry/Bugsnag) หรือการตั้งค่าให้มีการลองเรียก API ใหม่โดยอัตโนมัติ (Retry Mechanism) หากพบ Status 503

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


อ่านเพิ่มเติม