انتقل إلى محتوى الدرس
الدرس 35
دورة جافا سكريبت

معالجة الأخطاء والاستثناءات في JavaScriptJavaScript Error Handling

عالج الأخطاء والاستثناءات في JavaScript باحتراف: احتوِ الأعطال عبر try وcatch وافحص كائن Error واضمن التنظيف عبر finally وأطلق أخطاء التحقق بـ throw بأمان.
أقسام الدرس
6
الأمثلة
2
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

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

مَيّز بين خطأ الصياغة SyntaxError الذي يُكتشف قبل بدء التشغيل، وأخطاء وقت التشغيل مثل ReferenceError وTypeError وRangeError التي يمكننا احتواؤها بذكاء.

مخطط دورة معالجة الأخطاء في JavaScript عبر كتل try وthrow وcatch وfinally الحتمية

أحط التعليمات المحتمل تعثرها بكتلة try { ... } متبوعةً مباشرةً بكتلة catch (err) { ... }:

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

عند انتقال الخطأ إلى catch (err) يمرر المحرك كائناً منظماً يحمل خاصيتين قياسيتين: err.name (نوع الخطأ مثل "TypeError") وerr.message (الوصف النصي للسبب):

نوع الخطأ القياسيمتى يقع؟مثال مسبب
ReferenceErrorمحاولة قراءة اسم متغير غير معرف أصلاًconsole.log(missingVar)
TypeErrorتنفيذ عملية على نوع بيانات لا يقبلهاconst x = null; x.trim()
RangeErrorتمرير رقم يتجاوز النطاق المسموح به(12.5).toFixed(500)
JavaScript
const rawCoupon = null;
let statusLine = '';
try {
  statusLine = rawCoupon.toUpperCase();
} catch (err) {
  statusLine = `Recovered from ${err.name} — using default code`;
}
document.getElementById('err-out').textContent = statusLine;

إضافة كتلة finally { ... } في النهاية تضمن تشغيل خطوات التنظيف الختامية—كإخفاء مؤشر التحميل أو إعادة تفعيل زر الإرسال—في جميع الأحوال حتماً، سواء اكتملت كتلة try بنجاح أم وقع خطأ التقطته catch.

أحياناً تكون القيمة مقبولة نحوياً في اللغة (مثل عمر سالب -5 أو مبلغ سحب 0) لكنها مرفوضة في منطق تطبيقك! حينئذ نستخدم التعليمة throw new Error("سبب واضح") لإطلاق استثناء مخصص ينقل التنفيذ فوراً إلى كتلة catch.

أطلق دائماً كائناً حقيقياً عبر new Error(...) وتجنب رمي نص مجرد مثل throw "bad" حتى تظل خاصيتا err.name وerr.message متوفرتين بانتظام.

JavaScript
const transferUsd = -25;
let uiBanner = '';
let isBusy = true;
try {
  if (transferUsd <= 0) throw new RangeError('Amount must exceed 0');
  uiBanner = `Sent ${transferUsd} USD`;
} catch (err) {
  uiBanner = `Validation failed: ${err.message}`;
} finally {
  isBusy = false;
}
document.getElementById('th-out').textContent = `${uiBanner} | Busy: ${isBusy}`;

يرسخ الأمن السيبراني الحديث قاعدة ذهبية تفصل بين ما يراه المستخدم وما يفحصه المطور: اعرض للزائر دائماً رسالة ودية مهذبة ومختصرة عبر textContent ترشده لما يفعل، وإياك وطباعة تتبع المكدس التفصيلي err.stack أو أسماء الملفات والمسارات الداخلية في الواجهة العامة!

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس تصنيف أخطاء وقت التشغيل، واحتواء الاستثناءات بكتلتي try وcatch، وفحص err.name وerr.message، وضمان التنظيف الختامي عبر finally، وإطلاق أخطاء التحقق عبر throw new Error() مع حماية خصوصية النظام. الخطوة التالية: انطلق الآن إلى الفصل السابع (الحلقات التكرارية) لأتمتة معالجة القوائم والعدادات ببضعة أسطر!

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 try...catch...finally بنية احتواء الأخطاء try/catch/finally
بنية تحمي البرنامج بتجربة الكود في try والتقاط الخطأ في catch وتنفيذ التنظيف الدائم في finally.
للمراجعة
02 throw Statement تعليمة إطلاق الاستثناء throw
تعليمة تطلق كائن خطأ مخصص عند رصد حالة غير صالحة وتنقل التنفيذ فوراً إلى كتلة catch.
للمراجعة
03 TypeError & ReferenceError خطآ النوع والمرجع القياسيان
أشهر أخطاء وقت التشغيل الناتجة عن عملية غير صالحة للنوع أو قراءة متغير غير معرف.
للمراجعة
04 Information Disclosure تسريب تفاصيل النظام بالرسائل
ممارسة غير آمنة تتمثل في إظهار مسارات الملفات وتفاصيل المكدس التقنية للزائر العام.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 OWASP OWASP
Open Worldwide Application Security Project
المنظمة العالمية لأمن تطبيقات الويب التي توصي بإخفاء التفاصيل الداخلية من رسائل الخطأ العامة.
للمراجعة
02 UX UX
User Experience
تجربة المستخدم التي نحافظ على سلاستها باحتواء الأعطال وتقديم رسائل واضحة بدلاً من تجميد الصفحة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افتح مثال التحقق من التحويل المالي وغيّر قيمة transferUsd من -25 إلى 150 وتأكد أن finally ما زالت تضبط isBusy على false.

  2. قارن بين التبويب الأول والثاني في المحاكي لملاحظة متى يتم تخطي catch ومتى تلتقط الخطأ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

متى يتم تنفيذ كتلة finally { ... } داخل بنية try / catch / finally؟

02

ما الخاصيتان القياسيتان في كائن الخطأ (err) اللتان تحملان اسم نوع الخطأ ووصفه النصي؟

03

ما التعليمة القياسية النظيفة لإطلاق خطأ تحقق مخصص داخل كتلة try؟

04

ما نوع الخطأ القياسي الذي يُطلق عند محاولة قراءة متغير لم يتم التصريح عنه إطلاقاً؟

05

إذا اكتملت جميع أسطر كتلة try بسلام دون وقوع أي خطأ، يتم تخطي كتلة catch بالكامل.

06

تستطيع كتلة try / catch التقاط خطأ صياغة نحوي SyntaxError كقوس ناقص في نفس الملف.

07

لماذا يجب أمنياً عدم عرض محتوى err.stack التقني الخام أمام زوار الموقع في بيئة الإنتاج؟

08

تنفيذ const x = null; متبوعاً بـ x.toUpperCase(); يُطلق أي نوع من أخطاء وقت التشغيل؟

09

يُفضل إطلاق كائن new Error("...") بدلاً من نص مجرد لضمان توفر خاصيتي err.name وerr.message بانتظام.

10

ترك كتل catch (e) {} فارغة تماماً لإخفاء جميع الأخطاء بصمت يُعد أفضل ممارسة هندسية موصى بها.