Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Обработка на изключения
Персонализиране на класове за изключения
Цел
Проверете събраната дъждовна вода и се уверете, че тя се преработва и пренася правилно чрез персонализиране на класове за изключения.
В далечния край на покривния комплекс има цистерна със събрана дъждовна вода, която се филтрира и се разпределя из цялата сграда за различни цели. Някои клапани на горната стена контролират налягането на водата, която тече, докато последната складова стая съдържа различни бойлери. Работата с машини може да бъде предизвикателство, но нейното изпълнение може да бъде значително оптимизирано чрез дефиниране на кодове за грешки и създаване на ефективни мерки за противодействие. Това се постига чрез персонализиране на класове за изключения, които вие създавате за вашите персонализирани изключения.
В редактора на кода са настроени два персонализирани класа за изключения, като вашата способност да ги използвате ще бъде от съществено значение за отстраняване на проблеми с машините, които може да срещнете. Първият е изключение за отстраняване на проблеми с налягането на водата. Той е предназначен за използване с клапаните, за да се уверите, че водата тече правилно в комплекса или ако налягането трябва да бъде регулирано. В зависимост дали налягането е под 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) такива, регулиращи налягането на водата, която се изпомпва от цистерната. Съществуват четири (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 знак, докато сте обърнати към бойлерите, изпълнете последователността, използвайки константните променливи, съответстващи на правилните цветни килими, за да завършите нивото.