Курс по усъвършенствано разработване с 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 eval(self):
await player.display("[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 eval(self):
await player.display("[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: error = await x.eval() player.speak(error) 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: error = await x.eval() player.speak(error) else: player.speak( "Temperature is ok" )
Направете това за всички бойлери; на всеки X знак, като се обърнете към бойлерите, изпълнете последователността, използвайки константите с променливи, съответстващи на правилно избраните цветни пердета, за да завършите нивото.