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