دورة تطوير بايثون المتقدمة
الفصل
>
المستوى
معالجة الاستثناءات
استثناءات متعددة
الهدف
قم بتجميع وتخزين بعض المستلزمات الطبية بشكل صحيح في الصناديق باستخدام استثناءات متعددة.
تحتاج المخازن الموجودة في السقف إلى التجديد، فقد تم استخدام بعض المستلزمات ولم يتم استبدالها. هناك طلب للحصول على مزيد من المواد في مذكرة بأحد المخازن، ومن الجيد الاهتمام بهذا الأمر. وبالمثل، هناك مجموعة متنوعة من المواد المختلفة التي يجب تجميعها وتخزينها في الصناديق.
بسبب اختلاف أنواع البيانات وعدد المواد اللازمة لملء الصناديق، قد نواجه أخطاء متعددة. يمكننا استخدام try / except لالتقاط أي أخطاء محتملة وإصلاح بعض المشاكل، لكن ماذا يحدث عندما تواجه عدة أخطاء محتملة في عملية واحدة؟ لمعالجة ذلك، يمكننا تحديد الاستثناءات التي نحاول التقاطها واستخدام استثناءات متعددة.
لبدء العملية، توجه إلى علامة X الذهبية وواجه الباب، واستخدم الدالة open() لدخول المخزن. بمجرد الدخول، توجه إلى علامة X الداكنة وادخل إلى اليمين لاستخدام الدالة read() والتحقق من المواد والكميات المطلوبة في المذكرة على الطاولة. تُكتب معلومات الثوابت القائمة في المذكرة، بما في ذلك المستلزمات والطلبات المتعلقة بها. عند الانتهاء، توجه إلى علامة X الفاتحة داخل المخزن، استدر نحو الصندوق والتقط الثابت القائم pads للمواد باستخدام الدالة collect(), مثل هذا: player.collect(pads).
داخل المخزن توجد مخازن لـ "peroxide" و "isopropyl"، توجه واجمعهما ثم اخرج وامضِ نحو علامة X الداكنة فوق سجادة بنفسجية. على السجادة البنفسجية، وأنت مواجه للصندوق، استخدم الدالة collect() لالتقاط "water bottle"، ثم انتقل إلى علامة X الداكنة فوق السجادة الصفراء واستخدم الدالة collect() لالتقاط "glass bottle".
الآن وبعد جمع العناصر، حان الوقت لتنفيذ الطلب ووضع جميع المواد داخل صناديق المخزن على اليمين. للقيام بذلك، سنقوم أولاً بتخزين: "water bottle"، "peroxide"، و "isopropyl" داخل قائمة تُسمى supplies. على علامات X الداكنة فوق السجاد الأحمر، الأخضر، والأزرق، سنستخدم الصناديق لتخزين المستلزمات الطبية. لهذا سننشئ ثلاث قوائم: blue_crate = []، green_crate = [] و red_crate = [].
قبل وضع جميع العناصر، يجب علينا ملء القوائم بالمواد. لهذا سنستخدم حلقة تكرار للتجول عبر القوائم ودمجها في قائمة واحدة. هذا سيضع جميع العناصر من supplies في القائمة وسيقسم عدد عناصر pads وفقًا للطلب المذكور في المذكرة بالمخزن.
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
على الرغم من ذلك، ستلاحظ ظهور أخطاء، بالرغم من أن كل شيء يتم بشكل صحيح والكود سليم. المشكلة تكمن في أن قائمة supplies تحتوي على ثلاثة (3) عناصر فقط، بينما تعمل الحلقة خمس (5) مرات مما يسبب Index Error. وفي الوقت نفسه، ليس فقط أن قائمة pads تحتوي على ثلاثة (3) عناصر فقط، بل أن إحدى قيم الطلب تساوي 0، حيث أن أي رقم يُقسم على 0 يؤدي إلى Zero Division Error لأنه لا يمكن قسمة أي رقم على 0 في الرياضيات.
هذا هو المكان الذي تكون فيه الاستثناءات المتعددة مفيدة؛ حيث نستخدم كتل الكود try / except لالتقاط الأخطاء والسماح لنا بالاستمرار في تنفيذ الكود. بما أن هناك خطأين يحدثان، يجب علينا تحديد كل خطأ لالتقاط الاستثناءات المحددة. يتم ذلك بتوسيع كتل except بهذه الطريقة: except IndexError: و except ZeroDivisionError:. على سبيل المثال:
for x in range(5): try: blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x]) except IndexError: blue_crate.append("glass bottle") except ZeroDivisionError: blue_crate.append(0)
يتم تصحيح Index Error عن طريق ملء الأماكن المفقودة في القائمة بـ "glass bottle"، ويتم معالجة Zero Division Error عن طريق إضافة قيمة 0 في حال وقوع العملية غير القانونية.
قم بذلك لقوائم blue_crate = []، green_crate = [] و red_crate = []. توجه إلى علامة X الداكنة فوق السجاد الأزرق، الأخضر، والأحمر، واستخدم الدالة place() لتخزين القوائم في الصناديق المقابلة لإكمال المستوى.