JavaScript
Error Handling
Error Object — .message, .name, และ new Error()
ทำความรู้จักกับ Error object — มันคืออะไร .message กับ .name บอกอะไรเรา และ new Error() ใช้ยังไง
Error Object คืออะไร
เวลา JavaScript เจอปัญหาที่ทำงานต่อไม่ได้ มันจะสร้าง **Error object** ขึ้นมา — เป็น object พิเศษที่บรรจุข้อมูลว่ามีอะไรผิดพลาด Error object มี property สำคัญ 2 ตัวที่ควรรู้จัก: - **`.name`** — บอก**ประเภทของ error** ว่าเป็น error แบบไหน (เช่น `TypeError`, `ReferenceError`) - **`.message`** — บอก**รายละเอียด**ว่าผิดพลาดอะไร เป็นข้อความให้มนุษย์อ่านเข้าใจ คิดง่าย ๆ: `.name` เปรียบเหมือน **ชื่อโรค** ส่วน `.message` คือ **คำอธิบายอาการ** ทุกครั้งที่เราเขียนโค้ดแล้วเห็นข้อความสีแดงใน console — นั่นคือ JavaScript กำลังแสดง Error object ให้เราดูนั่นเอง
ตัวอย่าง error ที่เกิดขึ้นจริงใน JavaScript พร้อมอธิบายว่า .name และ .message คือส่วนไหน
// ตัวอย่างที่ 1: ใช้ตัวแปรที่ยังไม่ประกาศ
console.log(notDefinedYet);
// ❌ ReferenceError: notDefinedYet is not defined
// .name = "ReferenceError"
// .message = "notDefinedYet is not defined"
// ตัวอย่างที่ 2: ใช้ method ที่สะกดผิด
let text = "hello";
text.toUppercase(); // ตัว C ควรเป็นพิมพ์เล็ก
// ❌ TypeError: text.toUppercase is not a function
// .name = "TypeError"
// .message = "text.toUppercase is not a function"- Error object ถูกสร้างโดย JavaScript โดยอัตโนมัติเมื่อโค้ดมีข้อผิดพลาด
- `.name` — ชื่อประเภทของ error (`"TypeError"`, `"ReferenceError"`, ฯลฯ)
- `.message` — คำอธิบายเป็นข้อความว่าผิดพลาดอะไร
- Error object ทุกตัวมี `.name` และ `.message` เป็นอย่างน้อย
.message — ข้อความอธิบายสิ่งที่ผิดพลาด
`.message` เป็น property ชนิด `string` ที่อธิบายว่าเกิดอะไรผิดพลาด ข้อความนี้ออกแบบให้**มนุษย์อ่านแล้วเข้าใจ** เวลาเราสร้าง Error ใช้เอง เรากำหนด `.message` ได้อย่างอิสระ — ทำให้สื่อสารสิ่งที่เราต้องการบอกกับคนที่มาอ่าน error ได้ตรงจุด
สร้าง Error object ด้วย new Error() แล้วดูค่า .message
const err1 = new Error("ไม่พบไฟล์ที่ต้องการ");
console.log(err1.message);
// output: "ไม่พบไฟล์ที่ต้องการ"
const err2 = new Error("รหัสผ่านต้องมีความยาวอย่างน้อย 8 ตัว");
console.log(err2.message);
// output: "รหัสผ่านต้องมีความยาวอย่างน้อย 8 ตัว"
// ถ้าสร้าง Error โดยไม่ระบุข้อความ
const err3 = new Error();
console.log(err3.message);
// output: "" (string ว่าง)- `.message` เป็น `string` — อ่านแล้วเข้าใจว่าเกิดอะไรขึ้น
- ถ้าสร้าง `new Error()` โดยไม่ระบุข้อความ `.message` จะเป็น `""` (string ว่าง)
- เขียน `.message` ให้มีประโยชน์ — บอกว่า**อะไร**ผิดพลาด และควรแก้อย่างไรถ้าทำได้
.name — ชื่อประเภทของ Error
`.name` เป็น property ชนิด `string` ที่ระบุ**ประเภทของ error** ว่าเป็น error แบบไหน Error object ที่สร้างจาก `new Error()` จะมี `.name` เป็น `"Error"` — เป็นชื่อ default แต่เวลา JavaScript สร้าง error ให้เอง มันจะเลือก `.name` ให้เหมาะสมกับปัญหา เช่น:
Error ที่สร้างด้วย new Error() มี .name เป็น "Error"
const err = new Error("มีบางอย่างผิดพลาด");
console.log(err.name);
// output: "Error"
console.log(err.message);
// output: "มีบางอย่างผิดพลาด"
// Error object ก็คือ object ธรรมดาที่มี .name กับ .message
console.log(typeof err); // "object"| .name | ความหมาย | ตัวอย่างสถานการณ์ที่เจอ |
|---|---|---|
| Error | Error พื้นฐาน — เป็น default เมื่อเราสร้างเอง | `new Error("ข้อความ")` |
| SyntaxError | เขียน syntax ผิดกฎของภาษา JavaScript | ลืมปิดวงเล็บ หรือพิมพ์ `{` เกินมา |
| TypeError | ใช้ค่าผิด type — เช่นเรียก string เหมือนเป็น function | `"hello"()` หรือ `null.prop` |
| ReferenceError | อ้างอิงตัวแปรที่ยังไม่เคยประกาศ | ใช้ตัวแปรที่สะกดผิดหรือลืมประกาศ |
| RangeError | ค่าอยู่นอกช่วงที่ยอมรับได้ | สร้าง array ที่มีความยาวเป็นลบ |
เราไม่ต้องจำทั้งหมดตอนนี้ — แค่เข้าใจว่า `.name` บอก**ประเภทของ error** และ JavaScript จะเลือก `.name` ให้อัตโนมัติตามลักษณะของปัญหา ในบทถัด ๆ ไป เราจะลงลึก error แต่ละประเภททีละตัว เพื่อให้รู้ว่าเจอแบบไหนต้องแก้ยังไง
new Error() — สร้าง Error Object ด้วยตัวเอง
เราไม่ได้พึ่ง JavaScript ให้สร้าง Error ให้อย่างเดียว — เราสามารถ**สร้าง Error object ใช้เอง**ได้ด้วย `new Error("ข้อความ")` การสร้าง Error เองมีประโยชน์เมื่อเราอยากเตรียม object ที่เก็บข้อมูลข้อผิดพลาดไว้ใช้ภายหลัง **ข้อสำคัญ**: การสร้าง Error object **เฉย ๆ** ไม่ได้ทำให้โปรแกรมหยุดทำงาน! `new Error()` เป็นแค่การสร้าง object — โค้ดบรรทัดถัดไปยังทำงานต่อตามปกติ (การทำให้โปรแกรมหยุดต้องใช้ `throw` ซึ่งเป็นบทถัดไป)
new Error() คืนค่าเป็น Error object — การทำงานของโปรแกรมไม่หยุด
// สร้าง Error object — คล้ายกับการสร้าง object ทั่วไป
const myError = new Error("อายุต้องมากกว่า 0");
// ดู property ของ Error object
console.log(myError.message); // "อายุต้องมากกว่า 0"
console.log(myError.name); // "Error"
// Error object ก็คือ object — ใช้ console.log ดูได้
console.log(myError);
// output (ใน Node.js): Error: อายุต้องมากกว่า 0
// สำคัญ: โค้ดบรรทัดนี้ยังทำงานต่อได้!
// new Error() ไม่ได้หยุดโปรแกรม — มันเป็นแค่การสร้าง object
console.log("โปรแกรมยังทำงานต่อปกติ");- `new Error("ข้อความ")` สร้าง Error object — `.name` จะเป็น `"Error"` `.message` จะเป็นข้อความที่เราใส่
- การสร้าง Error **ไม่ได้ทำให้โปรแกรมหยุด** — มันคือการสร้าง object ปกติ (ดูบท `throw` สำหรับการหยุดโปรแกรม)
- `console.log(errorObject)` ใช้ได้ — JavaScript จะแสดงข้อมูล error ออกมา
- Error object เก็บข้อมูลข้อผิดพลาดไว้รอใช้งาน — เหมือนเตรียมข้อความไว้ก่อน แล้วค่อยตัดสินใจทีหลังว่าจะเอาไปใช้ยังไง
ข้อควรระวังและความเข้าใจผิดที่พบบ่อย
มือใหม่มักเข้าใจผิดเกี่ยวกับ Error object หลายเรื่อง — มาดูเรื่องที่ควรระวังกัน:
| เรื่องที่เข้าใจผิด | สิ่งที่เกิดขึ้นจริง |
|---|---|
| คิดว่า `new Error()` ทำให้โปรแกรมหยุด | `new Error()` เป็นแค่การสร้าง object — โค้ดถัดไปยังทำงานปกติ การหยุดโปรแกรมต้องใช้ `throw` |
| คิดว่า error ทุกตัวคือ `Error` เหมือนกันหมด | JavaScript มี error หลายประเภท แต่ละประเภทมี `.name` ต่างกัน — ดู `.name` เพื่อรู้ว่าเป็น error ประเภทไหน |
| คิดว่า `.message` ต้องเป็นภาษาอังกฤษ | `.message` เป็น string — จะใส่ภาษาไทยหรือภาษาอะไรก็ได้ |
| อ่านแค่ `.message` แล้วคิดว่าเข้าใจหมดแล้ว | นอกจาก `.name` และ `.message` แล้ว console ยังแสดง **stack trace** — บอกว่า error เกิดที่บรรทัดไหน และผ่าน function อะไรมาบ้าง — ซึ่งสำคัญมากสำหรับการ debug |
| คิดว่า `"Error"` (string) กับ `Error` (ตัว constructor) คือสิ่งเดียวกัน | `"Error"` (ใน `err.name`) คือ string — ส่วน `Error` คือ constructor function ที่ใช้สร้าง Error object — คนละเรื่องกัน |
สรุป — สิ่งที่ต้องรู้เกี่ยวกับ Error Object
- **Error object** คือ object ที่เก็บข้อมูลข้อผิดพลาด — JavaScript สร้างให้อัตโนมัติเมื่อมีปัญหา หรือเราสร้างเองด้วย `new Error()` ก็ได้
- **`.message`** — `string` ที่อธิบายว่าผิดพลาดอะไร (มนุษย์อ่านเข้าใจ)
- **`.name`** — `string` ที่ระบุประเภทของ error (เช่น `"Error"`, `"TypeError"`, `"SyntaxError"`)
- **`new Error("ข้อความ")`** — สร้าง Error object เอง `.name` เป็น `"Error"` และ `.message` เป็นข้อความที่เรากำหนด
- การสร้าง Error object **เฉย ๆ ไม่ได้หยุดโปรแกรม** — มันคือการสร้าง object ปกติ
- เวลา debug — ดู `.name` เพื่อรู้**ประเภท** และดู `.message` เพื่อรู้**รายละเอียด**
| สิ่งที่อยากรู้ | ดูที่ |
|---|---|
| error เกิดจากอะไร | `.message` |
| error ประเภทไหน | `.name` |
| error เกิดที่บรรทัดไหน ผ่าน function อะไรมาบ้าง | stack trace (บรรทัดที่ console แสดงต่อจาก error message) |