Curso Avançado de Desenvolvimento Python
Capítulo
>
Nível
Tratamento de Exceções
Personalizando Classes de Exceção
Objetivo
Verifique a água da chuva coletada e assegure que ela esteja sendo processada e transferida corretamente personalizando classes de exceção.
No final do complexo de telhados, há uma cisterna com água da chuva coletada; essa água é filtrada e distribuída por todo o prédio para diversos usos. Algumas válvulas na parede superior controlam a pressão da água em fluxo, enquanto o último depósito abriga vários aquecedores de água. Operar maquinário pode ser complicado, porém sua operação pode ser otimizada de forma eficaz ao definir códigos de erro e estabelecer contramedidas efetivas. Isso é alcançado personalizando classes de exceção que você cria para suas exceções customizadas.
Há duas classes de exceção personalizadas configuradas no editor de código; sua capacidade de usá-las será essencial para solucionar quaisquer problemas de maquinário que você encontrar. A primeira é uma exceção para diagnosticar problemas de pressão da água. Ela deve ser utilizada com as válvulas para garantir que a água esteja fluindo corretamente para o complexo ou para ajustar a pressão, se necessário. Dependendo se a pressão estiver abaixo de 100 ou acima de 300, uma ação diferente é tomada pela exceção; a pressão é um argumento que o usuário deve fornecer. Uma vez acionada, um pop-up customizado contendo um código de erro e uma mensagem é exibido.
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")
A segunda classe de exceção personalizada destina-se a modular a temperatura dos aquecedores de água. Se a temperatura estiver muito baixa ou muito alta, você deve inserir uma nova temperatura como argumento para corrigir o erro assim que ele ocorrer.
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")
Para começar, caminhe até a marca X clara sobre o tapete verde e encare o tanque com uma válvula; há quatro (4) destes regulando a pressão da água bombeada da cisterna. Existem quatro constantes variáveis: green_pressure, red_pressure, blue_pressure e orange_pressure, que armazenam a pressão de cada um dos tanques dos tapetes correspondentes às respectivas cores.
Em todas as marcas X claras, utilize os blocos de código try/except e else para verificar se a pressão em cada tanque está adequada. Se a pressão estiver abaixo de 100 ou se estiver acima de 300, levante a exceção customizada PressureError e passe a pressão como argumento. Se ativada, ela exibirá o código de erro e emitirá uma correção; caso contrário, a cláusula else será acionada, confirmando que a pressão no tanque está adequada. Por exemplo:
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" )
Faça isso em todas as marcas X claras, utilizando as constantes variáveis que correspondem a cada um dos tapetes coloridos e verificando ou ajustando as válvulas de pressão conforme necessário.
Depois de concluir, caminhe até a marca X dourada e utilize a função open() para acessar o depósito com o aquecedor de água. Uma vez dentro, dirija-se à marca X dourada que se encontra no depósito e use a função read() para ler o memorando no balcão. Esse memorando fornecerá informações sobre qual é a temperatura ideal para cada um dos aquecedores de água.
Após obter as informações sobre as temperaturas, dirija-se à marca X escura sobre o tapete roxo; aqui, usaremos a sequência de código try/except e else para verificar se os aquecedores de água estão na temperatura correta. Existem mais quatro (4) constantes variáveis associadas aos tapetes coloridos: purple_temperature, yellow_temperature, pink_temperature e white_temperature.
Na sequência, verificaremos se a temperatura está abaixo de 100; se estiver, levantaremos a exceção TemperatureError. Como uma exceção personalizada, ela aceita um argumento; neste caso, você deve inserir a temperatura lida no memorando para executar corretamente a contramedida da exceção e corrigir o problema. Por exemplo:
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" )
Faça isso para todos os aquecedores de água; em cada marca X, enquanto estiver de frente para os aquecedores, execute a sequência utilizando as constantes variáveis correspondentes aos tapetes coloridos corretos para completar o nível.