دورة تطوير بايثون المتقدمة
الفصل
>
المستوى
معالجة الاستثناءات
جملة else
الهدف
خذ مواد الإصلاح وقم بفرزها، ثم تخلص من النفايات غير المرغوب فيها باستخدام جملة else مع التعامل مع الاستثناءات.
تم تخزين بعض مواد الإصلاح في أعلى المبنى، وتُستخدم هذه المواد لإصلاح السقف بعد العواصف أو التآكل العام. تم تسليم بعضها مؤخرًا ولا يزال مخزنًا في الأغلفة والحاويات، بينما تم تخزين البعض الآخر لفترة طويلة جداً وتم رميها مع القمامة. سيكون من الجيد فرز المواد وتخزينها بشكل صحيح والتخلص من القمامة والنفايات.
بسبب طبيعة المواد غير المنظمة، من المحتمل أن تواجه أخطاء. يمكنك معالجة ذلك باستخدام كتلة الكود try / except، ولكن قد يكون الأمر معقداً قليلاً إذا لم تكن معتاداً على الأخطاء التي قد تواجهها. ومع ذلك، يمكنك توسيع أدوات التعامل مع الاستثناءات بإضافة جملة else. هذا يسمح لك بتنفيذ الكود إذا لم يتم تشغيل كتلة الـ except، مما يساعد على تبسيط الكود ويكون مفيداً عند تحديد الأخطاء وتنظيفها.
لبدء المهمة، يجب أن تدخل إلى مخزن الجناح الأيسر وتسير نحو علامة "X" الخفيفة. يقوم هذا المخزن بتخزين القوباء المستخدمة لإصلاح بلاط السقف. استخدم دالة collect() لالتقاط الثابت القائم باسم shingles.
من المحتمل أن تحتوي القائمة على عدة مواد قمامة مختلطة يجب إزالتها، علاوة على أنها مخزنة في ست (6) أقسام مختلفة، كل منها يحتوي على كمية من المواد. تحتاج إلى تجميع كل المواد في كومة واحدة. أنشئ متغيراً باسم red_storage لتخزين جميع المواد وقائمة باسم junk لتضع فيها كل المواد النفايات.
عادةً ما تقوم فقط بتحديد المواد، وتحويلها إلى أعداد صحيحة بواسطة int() وتخزينها في متغير لتتمكن من وضعها في مكانها. ولكن كما هو متوقع، بالنظر إلى المستويات السابقة في الفصل وموضوع هذا التمرين، فمن المؤكد أن يحدث خطأ.
for x in range(6): player.speak(int(shingles[x])) red_storage+=int(shingles[x])
سيؤدي هذا للأسف إلى حدوث خطأ من نوع Value Error، حيث يبدو أن بعض العناصر في القائمة ليست أرقاماً. لإصلاح ذلك، يمكنك استخدام كتلتي الكود try / except و else لفرز المواد. باستخدام كتلة else نحول فعلياً كتلة الـ except إلى فلتر يتخلص من العناصر غير المرغوب فيها في القائمة بينما تلتقط كتلة else وتنقل العناصر الجيدة من القائمة إلى المتغير الذي أنشأناه.
for x in range(6): try: player.speak(int(shingles[x])) except: player.speak("Item %s is junk" % (x)) junk.append(shingles[x]) else: red_storage+=int(shingles[x])
بهذا، يحتوي المتغير red_storage الآن على كل القوباء الصالحة، بينما تمت إضافة كل النفايات إلى القائمة junk. توجه إلى علامة X الذهبية في مخزن الجناح الأيسر الذي أنت فيه، واستخدم دالة write() لتسجيل عدد القوباء المخزنة، مثل هذا: await player.write("There are %s shingles ready for use in storage" % (red_storage)). بعد ذلك، توجه إلى علامة X الداكنة على سجادة حمراء واستخدم دالة place() لتخزين المتغير red_storage في الصندوق.
بمجرد انتهاء هذا المهمة، اتجه إلى مخزن الجناح الأيمن، هذا المخزن يخزن ألواح الخشب والمواد اللازمة لإصلاح هياكل الأسقف والجدران. توجه نحو علامة X الداكنة على سجادة خضراء واستخدم دالة collect() لالتقاط الثابت القائم باسم planks_set من الصندوق، تحتوي هذه القائمة على الألواح التي تم تنظيفها بالفعل من أي نفايات. توجه إلى علامة X الخفيفة المجاورة لها واستخدم دالة collect() مرة أخرى لالتقاط ثابت قائم آخر باسم shipment، وهي مواد ألواح تم شحنها مؤخراً ولا تزال تحتوي على بعض النفايات.
مثلما كان الحال في الغرفة السابقة، من المحتمل أن تحتوي قائمة shipment على عدة مواد قمامة مختلطة يجب إزالتها. مثل السابق، يتم تخزينها في ستة (6) أقسام مختلفة، كل منها يحتوي على كمية من المواد. أنشئ متغيراً باسم blue_storage لتخزين كل المواد بحيث يمكنك تجميعها في كومة واحدة. كما هو الحال من قبل، سيتم إيداع المواد النفايات في القائمة junk.
بالنسبة للألواح، سنقوم بتحويل وإضافة كل المواد الصالحة في قائمة shipment وإضافتها إلى قائمة planks_set، ثم نجمعها جميعاً، باستخدام int(), في المتغير blue_storage. ومع ذلك، كما كان الحال من قبل، من المتوقع حدوث أخطاء.
for y in range(6): planks_set[y]+=int(shipment[y]) player.speak(planks_set[y]) blue_storage+=int(planks_set[y])
هذه المرة يمكنك توقع حدوث خطأ من نوع Type Error، وهو ما يحدث عندما تحاول جمع أعداد وسلاسل معاً. يمكن معالجة ذلك باستخدام كتلتي الكود try / except و else مرة أخرى، حيث تقوم كتلة try بجمع القوائم معاً، وتقوم كتلة except بتصفية القمامة من القائمة، بينما تضيف جملة else الألواح إلى المتغير blue_storage.
for y in range(6): try: planks_set[y]+=int(shipment[y]) player.speak(planks_set[y]) except: player.speak( "Item %s is junk. Slot only has %s items" % (y,planks_set[y])) junk.append(shipment[y]) else: blue_storage+=int(planks_set[y])
الآن بعد أن تم تعبئة المتغير blue_storage، يمكنك توثيق وتخزين جميع ألواح الخشب. توجه إلى علامة X الذهبية في مخزن الجناح الأيمن، وواجه الطاولة واستخدم دالة write() لحصر المواد التي قمت بتجميعها، مثل هذا: await player.write("There are %s planks ready for use in storage" % (blue_storage))
لإتمام المستوى، توجه إلى علامة X الداكنة على السجادة الزرقاء واستخدم دالة place() لتخزين المتغير blue_storage في الصندوق. ثم توجه إلى علامة X الداكنة على السجادة البنفسجية في الغرفة الوسطى واستخدم دالة place() للتخلص من القائمة junk في فتحة القمامة، مكتملًا بذلك مهمتك.