跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

การจัดการ Error ใน JavaScript

บทความนี้กล่าวถึงความสำคัญของการจัดการ Error ใน JavaScript เพื่อให้โปรแกรมทำงานได้อย่างต่อเนื่องและให้ข้อมูลที่เป็นประโยชน์ในการแก้ไขปัญหา โดยอธิบายวิธีการจัดกา...

การจัดการ Error ใน JavaScript

การเขียนโปรแกรมหลีกเลี่ยงไม่ได้ที่จะต้องเจอกับข้อผิดพลาด (Error) ไม่ว่าจะเป็น Syntax Error, Runtime Error หรือ Logical Error การจัดการ Error อย่างมีประสิทธิภาพเป็นสิ่งสำคัญที่ช่วยให้โปรแกรมของเราทำงานได้อย่างราบรื่น และสามารถแจ้งเตือนผู้ใช้ได้อย่างเหมาะสมเมื่อเกิดปัญหา ในบทนี้ เราจะมาเรียนรู้วิธีการจัดการ Error ใน JavaScript โดยจะครอบคลุมถึง try...catch statement, throw statement และ Error object

ความสำคัญของการจัดการ Error

การจัดการ Error ที่ดีจะช่วยให้:

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

try...catch statement

try...catch statement เป็นวิธีพื้นฐานที่สุดในการจัดการ Error ใน JavaScript มันช่วยให้เราสามารถ "ดักจับ" Error ที่อาจเกิดขึ้นในส่วนของโค้ดที่เราต้องการ และจัดการกับมันอย่างเหมาะสม

โครงสร้าง:

try {
  // โค้ดที่อาจทำให้เกิด Error
} catch (error) {
  // โค้ดที่ใช้จัดการกับ Error
} finally {
  // โค้ดที่จะทำงานเสมอ ไม่ว่าจะมี Error หรือไม่ (Optional)
}

คำอธิบาย:

  • try: บล็อกของโค้ดที่อาจทำให้เกิด Error จะถูกวางไว้ในบล็อก try
  • catch: หาก Error เกิดขึ้นในบล็อก try, JavaScript จะข้ามไปยังบล็อก catch ทันที ตัวแปร error ในบล็อก catch จะเก็บข้อมูลเกี่ยวกับ Error ที่เกิดขึ้น
  • finally: บล็อก finally จะถูก execute เสมอ ไม่ว่าจะมี Error เกิดขึ้นหรือไม่ มักใช้สำหรับ clean-up operations เช่น การปิด connection หรือ release resources

ตัวอย่าง:

try {
  // พยายามแปลง string เป็น number
  let number = parseInt("Hello");

  // ถ้า parseInt ไม่สามารถแปลง string เป็น number ได้ มันจะ return NaN
  if (isNaN(number)) {
    throw new Error("ไม่สามารถแปลง string เป็น number ได้");
  }

  console.log("Number:", number);
} catch (error) {
  console.error("เกิด Error:", error.message);
} finally {
  console.log("การทำงานเสร็จสิ้น");
}

ในตัวอย่างนี้ parseInt("Hello") จะ return NaN ซึ่งทำให้เงื่อนไข isNaN(number) เป็นจริง จากนั้นเราจะ throw Error ใหม่ด้วยข้อความที่ระบุ จากนั้น บล็อก catch จะดักจับ Error นี้และแสดงข้อความ Error ใน console บล็อก finally จะถูก execute เสมอ

throw statement

throw statement ใช้เพื่อ "โยน" Error ออกมา ซึ่งเราสามารถใช้เพื่อสร้าง Error ของเราเองได้

โครงสร้าง:

throw expression;

expression สามารถเป็นอะไรก็ได้ เช่น string, number, boolean หรือ object โดยทั่วไปแล้ว เราจะใช้ Error object หรือ subclass ของมัน

ตัวอย่าง:

function divide(a, b) {
  if (b === 0) {
    throw new Error("ไม่สามารถหารด้วย 0 ได้");
  }
  return a / b;
}

try {
  let result = divide(10, 0);
  console.log("Result:", result);
} catch (error) {
  console.error("เกิด Error:", error.message);
}

ในตัวอย่างนี้ ฟังก์ชัน divide จะ throw Error หากตัวหาร (b) เป็น 0 จากนั้น บล็อก catch จะดักจับ Error และแสดงข้อความ Error

Error object

Error object เป็น built-in object ใน JavaScript ที่ใช้แทน Error ที่เกิดขึ้น มันมี properties ที่เป็นประโยชน์ เช่น name และ message

Properties ที่สำคัญ:

  • name: ชื่อของ Error (เช่น "Error", "TypeError", "ReferenceError")
  • message: ข้อความที่อธิบาย Error
  • stack: (Optional) Stack trace ที่แสดงลำดับการเรียกใช้ฟังก์ชันที่นำไปสู่ Error (ไม่ guaranteed ว่าจะมีในทุก environment)

ตัวอย่าง:

try {
  // พยายามเข้าถึงตัวแปรที่ยังไม่ได้ประกาศ
  console.log(undefinedVariable);
} catch (error) {
  console.log("Error Name:", error.name);       // Output: Error Name: ReferenceError
  console.log("Error Message:", error.message);   // Output: Error Message: undefinedVariable is not defined
  console.log("Error Stack:", error.stack);       // Output: (ขึ้นอยู่กับ browser และ environment)
}

ในตัวอย่างนี้ การพยายามเข้าถึง undefinedVariable จะทำให้เกิด ReferenceError ซึ่ง name property จะเป็น "ReferenceError" และ message property จะอธิบายว่าตัวแปรนั้นไม่ได้ถูก define

Error Types ที่พบบ่อย

JavaScript มี Error types หลายประเภท แต่ละประเภทบ่งบอกถึงชนิดของ Error ที่แตกต่างกัน ต่อไปนี้เป็น Error types ที่พบบ่อย:

  • Error: Base class สำหรับ Error ทุกประเภท
  • EvalError: Error ที่เกิดขึ้นเมื่อใช้ eval() (ไม่ค่อยใช้ในปัจจุบัน)
  • RangeError: Error ที่เกิดขึ้นเมื่อค่าตัวเลขไม่อยู่ใน range ที่อนุญาต
  • ReferenceError: Error ที่เกิดขึ้นเมื่อพยายามเข้าถึงตัวแปรที่ไม่ได้ถูก define
  • SyntaxError: Error ที่เกิดขึ้นเมื่อมี syntax ที่ไม่ถูกต้อง
  • TypeError: Error ที่เกิดขึ้นเมื่อพยายามใช้ type ของค่าที่ไม่ถูกต้อง
  • URIError: Error ที่เกิดขึ้นเมื่อใช้ฟังก์ชัน URI ผิดวิธี

การสร้าง Custom Error

เราสามารถสร้าง Error class ของเราเองได้โดยการ extends Error class ซึ่งจะช่วยให้เราสามารถกำหนด Error type ที่เฉพาะเจาะจงกับ application ของเราได้

ตัวอย่าง:

class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = "ValidationError";
  }
}

function validateEmail(email) {
  if (!email.includes("@")) {
    throw new ValidationError("Email address ไม่ถูกต้อง");
  }
  return true;
}

try {
  validateEmail("invalid-email");
} catch (error) {
  if (error instanceof ValidationError) {
    console.error("Validation Error:", error.message);
  } else {
    console.error("เกิด Error:", error.message);
  }
}

ในตัวอย่างนี้ เราสร้าง ValidationError class ที่ extends Error class และกำหนด name property เป็น "ValidationError" จากนั้น เราใช้ instanceof operator เพื่อตรวจสอบว่า Error ที่ถูก catch เป็น ValidationError หรือไม่

Asynchronous Error Handling

การจัดการ Error ใน Asynchronous JavaScript (เช่น Promises และ Async/Await) มีความสำคัญอย่างยิ่ง เราได้เห็นตัวอย่างการใช้ try...catch กับ async/await ไปแล้วในบทก่อนหน้า

ตัวอย่าง (Promises):

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const success = false; // สมมติว่าเกิด Error
      if (success) {
        resolve("Data fetched successfully");
      } else {
        reject(new Error("Failed to fetch data"));
      }
    }, 1000);
  });
}

fetchData()
  .then(data => console.log(data))
  .catch(error => console.error("Error:", error.message))
  .finally(() => console.log("Fetching complete"));

ตัวอย่าง (Async/Await):

async function fetchData() {
  try {
    const data = await new Promise((resolve, reject) => {
      setTimeout(() => {
        const success = false; // สมมติว่าเกิด Error
        if (success) {
          resolve("Data fetched successfully");
        } else {
          reject(new Error("Failed to fetch data"));
        }
      }, 1000);
    });
    console.log(data);
  } catch (error) {
    console.error("Error:", error.message);
  } finally {
    console.log("Fetching complete");
  }
}

fetchData();

ทั้งสองตัวอย่างนี้แสดงให้เห็นถึงวิธีการจัดการ Error ใน asynchronous operations โดยใช้ .catch() สำหรับ Promises และ try...catch สำหรับ Async/Await

Best Practices ในการจัดการ Error

ต่อไปนี้เป็นแนวทางปฏิบัติที่ดีในการจัดการ Error ใน JavaScript:

  • ใช้ try...catch อย่างระมัดระวัง: ดักจับ Error เฉพาะในส่วนของโค้ดที่คุณคาดว่าจะเกิด Error เท่านั้น
  • throw Error ที่มีความหมาย: ให้ข้อมูลที่ชัดเจนเกี่ยวกับสิ่งที่ผิดพลาด
  • สร้าง Custom Error types: เพื่อให้สามารถจัดการ Error ได้อย่างละเอียดมากขึ้น
  • Log Error: บันทึก Error เพื่อช่วยในการ debugging และ monitoring
  • จัดการ Error ใน Asynchronous Code: ใช้ .catch() สำหรับ Promises และ try...catch สำหรับ Async/Await
  • แสดงข้อความ Error ที่เป็นมิตรกับผู้ใช้: หลีกเลี่ยงการแสดงข้อความ Error ที่เป็น Technical ให้กับผู้ใช้

การจัดการ Error เป็นส่วนสำคัญของการเขียนโปรแกรม JavaScript ที่มีคุณภาพ การทำความเข้าใจและนำเทคนิคต่างๆ ที่กล่าวมาข้างต้นไปใช้ จะช่วยให้คุณสร้าง application ที่มีความเสถียรและน่าเชื่อถือมากยิ่งขึ้น

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务