Продвинутый курс разработки на 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 на зеленом ковре и повернитесь к баку с клапаном, их всего четыре, которые регулируют давление воды, перекачиваемой из цистерны. Существуют четыре константы-переменные: 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, чтобы проверить, соответствует ли температура в водонагревателях требуемой. Есть еще четыре переменные-константы, связанные с коврами определенных цветов: 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, при обращении к водонагревателям, выполните последовательность с использованием переменных-констант, соответствующих нужным цветным коврам, чтобы пройти уровень.