สร้างกลยุทธ์จัดการข้อผิดพลาดที่ชัดเจนด้วยคลาสเฉพาะทาง จุดดักจับ (catch boundary) ที่วางไว้อย่างเหมาะสม และ console ที่ใช้อย่างเต็มศักยภาพ
เปิดบทเรียนนี้ใน Kodokonความทนทานไม่ได้เกี่ยวกับการจับทุกข้อผิดพลาด แต่เกี่ยวกับการจับมัน ในที่ที่ถูกต้อง กฎภาคสนาม: ล้มเหลวให้เร็วและดังใกล้บั๊กที่สุดเท่าที่จะทำได้ (การตรวจสอบความถูกต้อง, ค่าคงที่ที่ต้องคงไว้) และจับเฉพาะที่ ขอบเขต ที่คุณตอบสนองได้จริง: แสดงข้อความ, ลองใหม่, บันทึกล็อก try/catch ที่ไม่ได้ทำอะไรที่เป็นประโยชน์ไม่ได้ทำให้โค้ดปลอดภัยขึ้น มันแค่ทำให้ความล้มเหลวเงียบงัน
function parseConfig(json) {
try {
return JSON.parse(json);
} catch (error) {
console.error("Unreadable config:", error.message);
throw error; // rethrow: nothing can be fixed here
} finally {
console.log("Finished reading configuration");
}
}สตริงธรรมดาไม่ได้ทำให้เกิดกลยุทธ์จัดการข้อผิดพลาด จง extend Error เพื่อสร้างคลาสที่พก ข้อมูลที่มีโครงสร้าง (สถานะ HTTP, ฟิลด์ที่ไม่ถูกต้อง) ซึ่งสามารถแยกแยะได้ด้วย instanceof ตั้งแต่ ES2022 ตัวเลือก cause เชื่อมข้อผิดพลาดต้นฉบับเข้ากับข้อผิดพลาดระดับสูง: คุณเปิดเผยข้อความเชิงธุรกิจที่ชัดเจนโดยไม่สูญเสียร่องรอยทางเทคนิค
class ApiError extends Error {
constructor(message, status, options) {
super(message, options);
this.name = "ApiError";
this.status = status;
}
}
try {
const low = new Error("socket timeout");
throw new ApiError("Profile unavailable", 503,
{ cause: low });
} catch (error) {
if (error instanceof ApiError) {
console.error(error.status, error.cause.message);
}
}console มีอะไรมากกว่า log: console.table จัดคอลเลกชันของอ็อบเจกต์ให้เรียงเป็นแถว, group/groupEnd ทำให้เอาต์พุตซ้อนกัน, time/timeEnd วัดระยะเวลา, console.assert บันทึกล็อกเฉพาะ เมื่อ เงื่อนไขเป็นเท็จ และ console.trace พิมพ์ call stack ปัจจุบัน เมื่อรวมกันแล้ว เครื่องมือเหล่านี้เอาชนะห่าฝนของ log นิรนามได้ขาดลอย
const users = [
{ name: "Ada", role: "admin" },
{ name: "Linus", role: "dev" },
];
console.table(users);
console.group("Checks");
console.assert(users.length > 0, "Empty list");
console.time("sort");
users.sort((a, b) => a.name.localeCompare(b.name));
console.timeEnd("sort");
console.groupEnd();finally ทำงานเมื่อใด?cause มีไว้ทำอะไรตอนสร้างข้อผิดพลาด?console.assert(condition, message) เป็นอย่างไร?