Kodokon kodokon.com

การดีบักและความทนทาน: try/catch, console ขั้นสูง, ข้อผิดพลาดที่กำหนดเอง

สร้างกลยุทธ์จัดการข้อผิดพลาดที่ชัดเจนด้วยคลาสเฉพาะทาง จุดดักจับ (catch boundary) ที่วางไว้อย่างเหมาะสม และ console ที่ใช้อย่างเต็มศักยภาพ

9 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

ความทนทานไม่ได้เกี่ยวกับการจับทุกข้อผิดพลาด แต่เกี่ยวกับการจับมัน ในที่ที่ถูกต้อง กฎภาคสนาม: ล้มเหลวให้เร็วและดังใกล้บั๊กที่สุดเท่าที่จะทำได้ (การตรวจสอบความถูกต้อง, ค่าคงที่ที่ต้องคงไว้) และจับเฉพาะที่ ขอบเขต ที่คุณตอบสนองได้จริง: แสดงข้อความ, ลองใหม่, บันทึกล็อก try/catch ที่ไม่ได้ทำอะไรที่เป็นประโยชน์ไม่ได้ทำให้โค้ดปลอดภัยขึ้น มันแค่ทำให้ความล้มเหลวเงียบงัน

JAVASCRIPT
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 เชื่อมข้อผิดพลาดต้นฉบับเข้ากับข้อผิดพลาดระดับสูง: คุณเปิดเผยข้อความเชิงธุรกิจที่ชัดเจนโดยไม่สูญเสียร่องรอยทางเทคนิค

JAVASCRIPT
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 นิรนามได้ขาดลอย

JAVASCRIPT
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();
เอาต์พุตที่มีโครงสร้าง: table, group, assertion และ timer

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. บล็อก finally ทำงานเมื่อใด?
    • เฉพาะเมื่อไม่มีข้อผิดพลาดถูกโยนออกมา
    • เฉพาะเมื่อ catch ถูกกระตุ้น
    • ในทุกกรณี รวมถึงหลังจาก return หรือ throw
  2. ตัวเลือก cause มีไว้ทำอะไรตอนสร้างข้อผิดพลาด?
    • เพื่อป้องกันไม่ให้ข้อผิดพลาดแพร่กระจาย
    • เพื่อแนบข้อผิดพลาดต้นฉบับและรักษาบริบททางเทคนิคไว้
    • เพื่อตั้งรหัสสถานะ HTTP โดยอัตโนมัติ
    • เพื่อกระตุ้น catch ใหม่
  3. พฤติกรรมของ console.assert(condition, message) เป็นอย่างไร?
    • มันบันทึกล็อกข้อความเฉพาะเมื่อเงื่อนไขเป็นเท็จ
    • มันโยนข้อยกเว้นหากเงื่อนไขเป็นเท็จ
    • มันบันทึกล็อกข้อความเฉพาะเมื่อเงื่อนไขเป็นจริง