دليل المبتدئين للتعامل مع أخطاء TypeScript

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

فهم الأخطاء في TypeScript

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

معالجة الأخطاء الأساسية باستخدام try وcatch

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

مثال على try وcatch

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new Error("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    console.error(error.message);
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Cannot divide by zero

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

أنواع الأخطاء المخصصة

يتيح لك TypeScript تحديد أنواع أخطاء مخصصة لتمثيل حالات الخطأ المحددة بشكل أفضل. تساعد أنواع الأخطاء المخصصة في تصنيف الأخطاء ومعالجتها بشكل أكثر فعالية.

إنشاء نوع خطأ مخصص

class DivisionError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "DivisionError";
  }
}

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new DivisionError("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    if (error instanceof DivisionError) {
      console.error(`Custom Error: ${error.message}`);
    } else {
      console.error("An unexpected error occurred");
    }
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Custom Error: Cannot divide by zero

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

حماية النوع باستخدام instanceof

تساعد حراس النوع مثل instanceof في تضييق نطاق نوع كائن الخطأ في كتلة catch، مما يسمح لك بالتعامل مع أنواع الأخطاء المختلفة بشكل مختلف.

مثال على حماية النوع

function processInput(input: string | number) {
  try {
    if (typeof input === "string") {
      console.log(input.toUpperCase());
    } else {
      throw new Error("Input must be a string");
    }
  } catch (error) {
    if (error instanceof Error) {
      console.error(`Error: ${error.message}`);
    } else {
      console.error("An unknown error occurred");
    }
  }
}

processInput("hello"); // Output: HELLO
processInput(42); // Output: Error: Input must be a string

يوضح هذا المثال حماية النوع في الكتلة catch للتأكد من أن كائن الخطأ هو مثيل لـ Error، مما يسمح بمعالجة الأخطاء بدقة.

استخدام finally للتنظيف

يمكن استخدام كتلة finally لتنفيذ التعليمات البرمجية التي يجب تشغيلها بغض النظر عما إذا كان قد حدث خطأ أم لا. وهذا مفيد لعمليات التنظيف مثل إغلاق الملفات أو تحرير الموارد.

مثال مع أخيرا

function readFile(filePath: string): string {
  try {
    // Simulate reading a file
    if (filePath === "") {
      throw new Error("File path cannot be empty");
    }
    return "File content";
  } catch (error) {
    console.error(`Error: ${error.message}`);
    return "";
  } finally {
    console.log("Cleanup: Closing file");
  }
}

console.log(readFile("path/to/file")); // Output: File content
console.log(readFile("")); // Output: Error: File path cannot be empty
                            //         Cleanup: Closing file

في هذا المثال، تضمن الكتلة finally تسجيل رسالة التنظيف بغض النظر عما إذا كان هناك خطأ ما يحدث أم لا.

خاتمة

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

باستخدام هذه التقنيات، يمكنك التعامل مع الأخطاء بسلاسة وتحسين قوة كود TypeScript الخاص بك. تدرب على هذه المفاهيم لتصبح متمكنًا من التعامل مع أخطاء TypeScript وكتابة تطبيقات أكثر مرونة.