في قرية Coinholt الغامضة، تقف خلف منضدة مخبزك، ترتّب دفعة طازجة من المعجنات. يُفتح الباب مصدرًا صريرًا، فتدخل Denara، تاجرة ماهرة ذات عين خبيرة بالبضائع الجيدة. بعد وجبة سريعة، تدفع نحوك عملة لامعة عبر المنضدة، تمثّل قيمة 100 وحدة.
تبتسم وأنت تأخذ العملة، وتلقي نظرة على التكلفة الإجمالية للوجبة: 88 وحدة. هذا يعني أن عليك أن تعيد 12 وحدة من الباقي.
تمدّ Denara يدها منتظرة. "أعطني أقل عدد ممكن من العملات"، تقول مبتسمة. "محفظتي ممتلئة بالفعل، ولا أريد أن أخاطر بفقدانها في الطريق."
أنت تعلم أن أمامك عدة خيارات. "لدينا Lumis (بقيمة 10 وحدات)، وViras (بقيمة 5 وحدات)، وZenth (بقيمة 2 وحدات) لدفع الباقي."
تحسب الاحتمالات بسرعة في ذهنك:
"أفضل خيار هو عملتان: Lumis واحدة وZenth واحدة"، تقول وأنت تسلّمها الباقي.
تبتسم Denara، ومن الواضح أنها أُعجبت. "كما في كل مرة، أصبتَ."
حدّد أقل عدد من العملات التي تعطيها لعميل بحيث يساوي مجموع قيمها مقدار الصرف الصحيح.
أحيانًا تحتاج إلى رفع استثناء. وعندما تفعل ذلك، ينبغي أن تُضمّن دائمًا رسالة خطأ ذات معنى توضّح مصدر الخطأ. فهذا يجعل الكود أكثر وضوحًا للقراءة ويساعد بشكل كبير في تصحيح الأخطاء. وفي الحالات التي تعرف فيها أن مصدر الخطأ سيكون من نوع معيّن، يمكنك اختيار رفع أحد أنواع الأخطاء المدمجة، لكن ينبغي أن تُضمّن رسالة ذات معنى رغم ذلك.
يتطلّب هذا التمرين تحديدًا أن تستخدم عبارة raise لـ"إطلاق" ValueError عندما يتعذّر إعطاء الباقي بالعملات المعطاة. لن تنجح الاختبارات إلا إذا رفعت exception باستخدام raise وأضفت معه رسالة.
لرفع ValueError مع رسالة، اكتب الرسالة كوسيط لنوع exception:
# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.