الدرس 9 من 10
الأخطاء والتقاطها
- 13 دقيقة
- 6 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
error و pcall و nil مع رسالة
الشرح
للفشل في Lua طريقتان. الأولى للفشل المتوقّع، كلاعب يشتري بذهب لا يكفي: الدالة لا تنهار، بل تُرجع nil ورسالة، return nil, "لا يكفي الذهب"، والمستدعي يفحص: local left, err = withdraw(gold, 30) ثم if not left then print(err) end. وهكذا تعمل io.open في المكتبة القياسية.
والثانية للخلل الذي لا ينبغي أن يحدث، كضرر سالب يصل من كود معطوب: error("ضرر غير صالح") توقف التنفيذ وتصعد في سلسلة النداءات حتى يلتقطها أحد، وإلا أوقفت السكربت كله. وفي خادم لعبة يعني هذا أن حدثًا واحدًا معطوبًا يُسقط كل ما بعده.
والالتقاط بـ pcall(f, ...): تنادي f بالوسائط، فإن نجحت أرجعت true ونتائجها، وإن رمت أرجعت false ورسالة الخطأ. وxpcall(f, handler, ...) مثلها، لكنها تمرّر الخطأ أوّلًا إلى handler، كـ debug.traceback لتعرف أين وقع. والخطأ الشائع pcall(damage(100, -5)): هنا تُنادى damage قبل أن تصل إلى pcall، فلا يُلتقط شيء.
المطلوب
اكتب withdraw(gold, amount) تُرجع الباقي، أو nil ورسالة إن زاد amount على gold. وdamage(hp, amount) ترمي error إن كان amount سالبًا، وإلا أرجعت الصحّة بعد الضرر دون أن تنزل تحت الصفر. وsafeDamage(hp, amount) تنادي damage بـ pcall، فتُرجع النتيجة إن نجحت، أو nil ورسالة الخطأ إن فشلت.
معايير التصحيح
6 معايير- withdraw تُرجع الباقي
- وعند النقص nil ورسالة
- damage تُنقص الصحّة ولا تنزل تحت الصفر
- damage ترمي خطأ للضرر السالب
- safeDamage تُرجع الصحّة الجديدة
- وتحوّل الخطأ إلى nil ورسالة دون أن ترميه