دورة تطوير بايثون المتقدمة
الفصل
>
المستوى
معالجة الاستثناءات
تخصيص فئات الاستثناء
الهدف
تحقق من مياه الأمطار المُجمعة وتأكد من معالجتها ونقلها بشكل صحيح عن طريق تخصيص فئات الاستثناءات.
في الطرف البعيد من مجمع السطح يوجد خزان لمياه الأمطار المُجمعة، حيث يتم فلترة هذه المياه ونقلها عبر المبنى لأغراض متعددة. بعض الصمامات على الجدار العلوي تتحكم في ضغط تدفق المياه، وفي الوقت نفسه تحتوي آخر غرفة تخزين على عدة سخانات مياه. قد يكون تشغيل الآلات معقداً، ومع ذلك يمكن تبسيط عملياتها بفعالية عن طريق تحديد رموز الأخطاء ووضع تدابير مضادة فعالة. يتم تحقيق ذلك من خلال تخصيص فئات الاستثناءات التي تقوم بإنشائها لاستثناءاتك المخصصة.
هناك فئتان مخصصتان للاستثناءات معدتان في محرر الشيفرة، وستكون قدرتك على استخدامهما ضرورية لاستكشاف أي مشكلات في الآلات التي قد تواجهها. الأولى هي استثناء لاستكشاف ضغط المياه. من المفترض استخدامها مع الصمامات لضمان تدفق المياه بشكل صحيح إلى المجمع أو لضبط الضغط إذا لزم الأمر. اعتماداً على ما إذا كان الضغط أقل من 100 أو أعلى من 300، يتم اتخاذ إجراء مختلف بواسطة الاستثناء، حيث يُستخدم الضغط كوسيط يجب على المستخدم تقديمه. عند تفعيله، يتم عرض نافذة منبثقة مخصصة تحمل رمز الخطأ والرسالة.
class PressureError(Exception):
def __init__(self, pressure, message="Water pressure is offset, pressure is: ", error_code=404):
self.pressure = pressure
self.message = message
self.error_code = error_code
super().__init__(self.message)
async def __str__(self):
await player.write("[Error: %s {%s %s}]" % (self.error_code , self.message, self.pressure))
if self.pressure < 100:
return ("Valve has been closed")
if self.pressure > 360:
return ("Valve has been opened")
الفئة الثانية من استثناءات المستخدم مُخصصة لتنظيم درجة حرارة سخانات المياه. إذا كانت الدرجة منخفضة جداً أو مرتفعة جداً، يجب عليك إدخال درجة حرارة جديدة كوسيط لتصحيح الخطأ عند حدوثه.
class TemperatureError(Exception):
def __init__(self, temp, message="Temperature is not appropiate, enter new temperature: ", error_code=808):
self.temp = temp
self.message = message
self.error_code = error_code
super().__init__(self.message)
async def __str__(self):
await player.write("[Error: %s {%s %s}]" % (self.error_code , self.message, self.temp))
return ("Temperature Corrected")
لبدء التنفيذ، توجه إلى علامة X الخفيفة فوق السجادة الخضراء وواجه الصهريج المزوّد بصمام، حيث يوجد أربعة (4) منها تتحكم في ضغط المياه التي تُضخ من الخزان. هناك أربعة ثوابت متغيرة: green_pressure، red_pressure، blue_pressure و orange_pressure، حيث تحمله كل منها ضغط الصهريج الخاص بالسجادة الملونة المقابلة.
على كل علامة X الخفيفة، استخدم تسلسل كتل الشيفرة try/except وelse للتحقق مما إذا كان الضغط في كل صهريج مناسباً. إذا كان الضغط أقل من 100 أو إذا كان أعلى من 300، قم برفع استثناء PressureError المخصص وأضف الضغط كوسيطة. عند التفعيل، سيعرض رمز الخطأ ويصدر إجراء التصحيح، وإلا يتم تفعيل جملة else التي تؤكد أن الضغط في الصهريج مناسب. على سبيل المثال:
try: if green_pressure < 100 or green_pressure > 360: raise PressureError(green_pressure) except PressureError as x: player.speak(x) else: player.speak( "Pressure is appropriate" )
قم بذلك على كل علامة X خفيفة، باستخدام الثوابت المتغيرة التي تتوافق مع كل من السجاد الملون والتحقق أو تعديل صمامات الضغط حسب الحاجة.
بمجرد الانتهاء، توجه إلى علامة X الذهبية واستخدم الدالة open() للوصول إلى غرفة التخزين التي تحتوي على سخان المياه. عند الدخول، توجه إلى علامة X الذهبية الموجودة داخل غرفة التخزين واستخدم الدالة read() لقراءة المذكرة الموجودة على المنضدة. ستزودك هذه المذكرة بمعلومات حول درجة الحرارة المثالية لكل من سخانات المياه.
بمجرد حصولك على المعلومات الخاصة بكل درجة حرارة، توجه إلى علامة X الداكنة فوق السجادة البنفسجية. هنا سنستخدم تسلسل الشيفرة try/except وelse للتحقق مما إذا كانت سخانات المياه تتمتع بالدرجة الحرارية الصحيحة. هناك أربع (4) ثوابت متغيرة أخرى مرتبطة بالسجاد الملون: purple_temperature، yellow_temperature، pink_temperature و white_temperature.
في هذا التسلسل، سنتحقق مما إذا كانت درجة الحرارة أقل من 100، وإذا كانت كذلك سنرفع استثناء TemperatureError. وكاستثناء مخصص، يأخذ وسيطاً، في هذه الحالة يجب عليك إدخال درجة الحرارة المقروءة من المذكرة لتفعيل تدبير التصحيح بشكل صحيح. على سبيل المثال:
try: if purple_temperature < 100: raise TemperatureError(120) except TemperatureError as x: player.speak(x) else: player.speak( "Temperature is ok" )
قم بذلك لجميع سخانات المياه. على كل علامة X أثناء مواجهة السخانات، نفذ التسلسل باستخدام الثوابت المتغيرة المقابلة للسجاد الملون الصحيح لإكمال المستوى.