الأخطاء
الخطأ هو طريقة الدالة في رفض المتابعة. تستخدم هذه الصفحة { drink: "tea" } بلا size. throw new Error("missing size") يوقف label فورًا، قبل return. يستقبل catch كائن Error هذا. يُقرأ سطر الصفحة caught / missing size.
هذه ليست صفحة تصحيح الأخطاء
استدعت الصفحة السابقة console.error("missing size") ثم أعادت نصًا بديلًا. استمر السكربت. لم يُرمَ شيء. console.error لا يرمي.
throw مختلف. الأسطر التي تليه في الدالة نفسها لا تُنفَّذ. وحده catch يستطيع أن يتولى الأمر. كان سطر التصحيح السابق fixed / tea / regular.
يحمل Error سلسلتين
new Error("missing size") ينشئ كائنًا. error.name هو Error. error.message هو النص المُمرَّر، missing size. تسجيل الكائن أقل فائدة من تسجيل هذين الحقلين.
يستقبل catch كائن Error
ترمي label عندما يغيب size. الاستدعاء داخل try، فيعمل catch ويطبع error.message، والنص هو missing size.
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea" }));
} catch (error) {
console.log(error.message);
}
السجل هو missing size. لم تصل label إلى return، فلا يُنتَج هنا tea / missing size.
الطلب الجيد يتخطى catch
أعطِ size القيمة regular. تعود label بشكل طبيعي. لا يعمل catch.
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea", size: "regular" }));
} catch (error) {
console.log(error.message);
}
السجل هو tea / regular.
يعمل finally في الحالتين
يعمل finally بعد try عند النجاح، وبعد catch عند الرمي. استخدمه لخطوة يجب أن تحدث في الحالتين.
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
label({ drink: "tea" });
} catch (error) {
console.log(error.message);
} finally {
console.log("done");
}
السجلان هما missing size ثم done. بعد الرمي يكتب finally القيمة done.
اقرأ الاسم والرسالة
التقط Error نفسه واطبع الحقلين في سطرين منفصلين.
try {
throw new Error("missing size");
} catch (error) {
console.log(error.name);
console.log(error.message);
}
السجلان هما Error ثم missing size. إذن error.name هو Error وerror.message هو missing size.
الفحص يرمي، والمستدعي يلتقط
requireSize تعرف القاعدة. ترمي ولا تبني تسمية. المستدعي يقرر ما يُطبع.
function requireSize(order) {
if (!order.size) {
throw new Error("missing size");
}
}
try {
requireSize({ drink: "tea" });
console.log("ok");
} catch (error) {
console.log(error.message);
}
السجل هو missing size. السطر console.log("ok") لا يُنفَّذ، لأن رمي requireSize قفز إلى catch.
السطر تحت الكوب
تستدعي الصفحة label بلا حجم. يبني catch السطر الظاهر من الرسالة.
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
let line = "";
try {
line = label({ drink: "tea" });
} catch (error) {
line = "caught / " + error.message;
}
document.getElementById("line").textContent = line;
</script>
</body>
</html>
يُقرأ السطر caught / missing size. كان طلب مكتمل سيعيد tea / regular ويترك catch بلا استخدام. fixed / tea / regular كان سطر صفحة التصحيح.
عند المنضدة
- استدعِ
label({ drink: "tea" })داخلtry. سجل catch هو missing size. - استدعِ
label({ drink: "tea", size: "regular" }). السجل tea / regular، ولا يعمل catch. - أضف
finallyحول الاستدعاء الفاشل. السجل الثاني هو done. - اقرأ
error.nameوerror.message. السجلان Error و missing size. - اقرأ سطر الصفحة: caught / missing size.
هفوات عند المنضدة
throw يوقف الدالة. console.error لا يرمي ولا يوقف الدالة.
- توقع تنفيذ الأسطر بعد
throw - نسيان
catchوترك الخطأ بلا التقاط - ظن أن
finallyيعمل فقط بعد النجاح - قراءة
error.messageعلى أنه الاسمError - قراءة السطر على أنه fixed / tea / regular
احتفظ بهذا
throw new Error("missing size")يوقفlabelقبلreturn- يستقبل
catchكائن Error ويطبعerror.message، وهو missing size - الطلب المكتمل يسجّل tea / regular ويتخطى
catch - بعد الرمي يكتب
finallyالقيمة done - يُقرأ سطر الصفحة caught / missing size
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى