اﻹستثنائات (Exceptions)

الاستثناءات (Exceptions)

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

استخدام حقيقي للاستثناءات

لنفرض أننا نقوم بكتابة برنامج مهمته فتح ملف معين والتعديل على محتواه... ولكن ماذا لو حدث خطأ؟ هناك الكثير من اﻷخطاء والمشاكل المتوقعة التي ربما تحدث في بعض اﻷحيان، ﻷن هناك عمليات ستحدث خارج إطار البرمجة، مثلاً:

  • ماذا لو كان الملف غير موجود؟
  • ماذا لو حدثت مشكلة أثناء فتح الملف؟
  • ماذا لو ليس لنا صلاحية حفظ الملف بعد تعديله؟

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

التحكم في الاستثناءات try.. catch

يمكننا استخدام اﻷمرين try و catch للتحكم في اﻷخطاء التي تحدث أثناء عمل البرنامج (Exceptions)

كتابة try.. catch

try{
  // هنا أوامر البرنامج
}
catch (error){
  // هنا اﻷوامر التي تُنفذ لو حدث خطأ
}
  • try: يتم وضع اﻷوامر داخل كتلة try ليتم تنفيذها بشكل طبيعي (مثلاً: فتح الملف)
  • catch: بداخلها يتم وضع اﻷوامر التي تُنفذ فقط لو حدث خطأ (مثلاً: عرض رسالة "حدث خطأ")

مثال على try.. catch

جرب طباعة متغير غير معرّف

بالتأكيد سيظهر خطأ... ﻷننا لم نقم بتعريف (إنشاء) المتغير

console.log(test);
ناتج التشغيل Uncaught ReferenceError: test is not defined

جرب باستخدام try.. catch

واﻵن جرب نفس المثال ولكن ضع أمر الطباعة داخل try

try{
  console.log(test);
}
catch (error){
  console.log("حدث خطأ");
}
ناتج التشغيل حدث خطأ

ويمكن استخدام catch مباشرة بدون متغير الخطأ في حالة أنك لا تريد معرفة ما هو الخطأ الذي حدث بالضبط:

try{
  console.log(test);
}
catch{
  console.log("حدث خطأ");
}

التحقق من الخطأ

لاحظ أن catch تأخذ مُدخل يمكنك تسميته بأي اسم، هذا المُدخل هو عبارة عن الخطأ الذي حدث،

يمكننا استخدام متغير الخطأ error .لمعرفة اسم الخطأ (وبناءا عليه مثلاً في البرامج الحقيقية يمكن عرض رسالة مختلفة حسب نوع الخطأ)

try{
  console.log(test);
}
catch (error){
  console.log(error.name);
}
ناتج التشغيل ReferenceError

المثال السابق يعرض اسم (نوع) الخطأ (الاستثناء)


try{
  console.log(test);
}
catch (error){
  console.log(error.message);
}
ناتج التشغيل test is not defined

المثال السابق يعرض رسالة المفسّر عن الخطأ

غالباً يختصر المبرمجون اسم متغير الخطأ حيث يقوموا بتسمية المتغير err أو e.

المساهمين

وجدت خطأ أو تريد المساهمة في محتوى الدرس؟ عدل الصفحة على Github