Kodokon kodokon.com

تصحيح الأخطاء والمتانة: try/catch، وحدة تحكم متقدمة، أخطاء مخصصة

ابنِ استراتيجية أخطاء صريحة بأصناف مخصصة، وحدود التقاط موضوعة في مكانها، ووحدة تحكم مستثمَرة إلى أقصى طاقتها.

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");
  }
}
سجّل، ثم أعد الرمي: الحدّ الأعلى هو من سيقرّر.

السلاسل النصية المجردة لا تصنع استراتيجية أخطاء. وسّع 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);
  }
}
خطأ عملي قابل للتمييز مع الحفاظ على السبب التقني.

تقدّم وحدة التحكم أكثر بكثير من log: يصفّ console.table مجموعات الكائنات، ويعشّش group/groupEnd المخرجات، ويقيس time/timeEnd مدة، ولا يسجّل console.assert إلا حين يكون الشرط خاطئا، ويطبع console.trace مكدس الاستدعاءات الحالي. ومجتمعةً، تتفوق هذه الأدوات بلا منازع على وابل من استدعاءات 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();
مخرجات مهيكلة: جدول، تجميع، تحقق، ومؤقّت.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. متى تُنفَّذ كتلة finally؟
    • فقط إن لم يُرمَ أي خطأ
    • فقط إن أُطلق catch
    • في كل حالة، بما في ذلك بعد return أو throw
  2. لماذا يُستعمل خيار cause عند إنشاء خطأ؟
    • لمنع الخطأ من الانتشار
    • لإرفاق الخطأ الأصلي والحفاظ على السياق التقني
    • لضبط رمز حالة HTTP تلقائيا
    • لإطلاق catch جديد
  3. ما سلوك console.assert(condition, message)؟
    • يسجّل الرسالة فقط إن كان الشرط خاطئا
    • يرمي استثناء إن كان الشرط خاطئا
    • يسجّل الرسالة فقط إن كان الشرط صحيحا