0Pricing
TypeScript Academy · درس

مشكلة طرح الأخطاء

تعرّفوا إلى سبب إخفاء الاستثناءات للفشل عن نظام الأنواع

مشكلة طرح الأخطاء درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

الاستثناءات غير مرئية

عندما تنفّذ دالة throw، لا يوضّح توقيعها ذلك. ولا يستطيع نظام الأنواع معرفة الدوال التي قد تفشل، لذلك لا يحصل المستدعون على أي تلميح من المترجم لمعالجة الأخطاء.

دالة تطلق استثناءً

تبدو هذه الدالة وكأنها تُعيد دائماً رقماً، لكنها قد تطلق استثناءً. ويخفي نوع الإعادة number حالة الفشل تماماً.

function parsePort(s: string): number {
  const n = Number(s);
  if (Number.isNaN(n)) throw new Error("bad port");
  return n;
}
console.log(parsePort("8080")); // 8080

ينسى المستدعون التقاط الأخطاء

لا شيء يُجبر المستدعي على إحاطة الاستدعاء بكتلة try/catch. يُترجم الخطأ دون مشكلة، ولا يظهر إلا كتوقف للبرنامج أثناء التشغيل.

const port = parsePort("oops");
// No compile error; throws at runtime, possibly crashing the app.

يفقد try/catch نوع الخطأ

حتى عند التقاط الخطأ، تكون القيمة الملتقطة من النوع unknown (أو any). ولا تُتتبّع بنية الخطأ، لذلك تصبح معالجته ضرباً من التخمين.

try {
  parsePort("x");
} catch (e) {
  // e: unknown -> you must narrow it manually
}

الأخطاء كقيم

البديل هو جعل الفشل قيمة عادية تُعيدها الدالة، بدلاً من كونه استثناءً تطلقه. عندها يوضّح نوع الإعادة النتيجتين بصراحة.

مخطط يعيد قيمة

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

type ParseResult =
  | { ok: true; value: number }
  | { ok: false; error: string };

النوع يوضّح الحقيقة الآن

تُعلن الدالة التي تُعيد ParseResult بوضوح أنها قد تفشل. ويفرض المترجم عندئذٍ على المستدعي معالجة فرع الفشل.

function parsePort(s: string): ParseResult {
  const n = Number(s);
  return Number.isNaN(n)
    ? { ok: false, error: "bad port" }
    : { ok: true, value: n };
}

معالجة مفروضة

لأن القيمة قد تنتمي إلى أيٍّ من الفرعين، لا يمكنك قراءة value قبل التحقق من ok. ولا يضيّق المترجم النوع إلا بعد إجراء هذا التحقق.

const r = parsePort("oops");
if (r.ok) console.log(r.value);
else console.log("failed:", r.error);

لا يزال للاستثناءات موضع

يمكن للحالات الفاشلة غير المتوقعة حقاً وغير القابلة للاسترداد، مثل أخطاء المبرمج ونفاد الذاكرة، أن تطلق استثناءات. وتتألق طريقة تمثيل الأخطاء كقيم في حالات الفشل المتوقعة، مثل التحليل والتحقق.

الصريح أفضل من الضمني

يجعل إرجاع الأخطاء مسار الفشل صريحاً في النوع، ومرئياً في موضع الاستدعاء، ويمنع تجاهله عرضاً، بخلاف throw المخفي.

نحو Result وOption

يتعمّم هذا الشكل الموسوم للنجاح أو الفشل ليصبح نوع Result قابلاً لإعادة الاستخدام، كما يتعمّم الغياب مقابل الحضور ليصبح نوع Option، وسنتناول كليهما تالياً.

مراجعة سريعة

مراجعة سريعة لهذا الدرس.

مراجعة

الأخطاء المُطلقة غير مرئية للأنواع: إذ تخفي التواقيع حالات الفشل، وينسى المستدعون التقاط الأخطاء. أما إرجاع الفشل كـقيمة صريحة، أي كائن موسوم للنجاح أو الخطأ، فيجعل مسار الفشل مرئياً في النوع ويمنع تجاهله، مما يقود إلى نوعَي Result وOption.

الأسئلة الشائعة

هل درس «مشكلة طرح الأخطاء» مجاني؟

نعم — نص درس «مشكلة طرح الأخطاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «مشكلة طرح الأخطاء»؟

تعرّفوا إلى سبب إخفاء الاستثناءات للفشل عن نظام الأنواع تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «مشكلة طرح الأخطاء»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مشكلة طرح الأخطاء
  2. نمذجة أنواع Result
  3. أنواع Option وMaybe
  4. البرمجة الموجّهة بالمسار
← العودة إلى TypeScript Academy