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 está sendo processada e transferida corretamente personalizando classes de exceção.
No extremo oposto do complexo do telhado, há uma cisterna de água da chuva coletada; essa água é filtrada e transferida para todo o edifício para diversos fins. Algumas válvulas na parede superior controlam a pressão da água que flui, enquanto a última despensa abriga vários aquecedores de água. Operar a maquinaria pode ser complicado, porém sua operação pode ser otimizada efetivamente delineando códigos de erro e estabelecendo contramedidas eficazes. Isso é alcançado personalizando classes de exceção que você cria para suas exceções personalizadas.
Existem duas classes de exceção personalizadas configuradas no editor de código; sua capacidade de usá-las será essencial para solucionar quaisquer problemas de maquinaria que você encontrar. A primeira é uma exceção para diagnosticar a pressão da água. Ela é destinada a ser usada com as válvulas para garantir que a água flua corretamente para o complexo ou se a pressão precisa ser ajustada. 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 personalizado 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 __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")
A segunda classe de exceção personalizada destina-se a modular a temperatura nos aquecedores de água; se a temperatura estiver muito baixa ou muito alta, você deve inserir uma nova temperatura como argumento a fim de 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 __str__(self):
await player.write("[Error: %s {%s %s}]" % (self.error_code , self.message, self.temp))
return ("Temperature Corrected")
Para começar, caminhe até a marca X leve sobre o tapete verde e enfrente o tanque com uma válvula; há quatro (4) destes regulando a pressão da água sendo bombeada da cisterna. Existem quatro (4) constantes variáveis: green_pressure, red_pressure, blue_pressure e orange_pressure; elas armazenam a pressão de cada um dos tanques dos tapetes correspondentes às cores.
Em todas as marcas X leves, use as sequências de 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 acima de 300, levante a exceção personalizada PressureError e adicione a pressão como argumento. Se ativada, ela levantará o código de erro e emitirá uma correção; caso contrário, a cláusula else é 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: player.speak(x) else: player.speak( "Pressure is appropriate" )
Faça isso em todas as marcas X leves, usando as constantes variáveis que correspondem a cada um dos tapetes coloridos e, dependendo, verifique ou ajuste as válvulas de pressão conforme necessário.
Depois, caminhe até a marca X dourada e use a função open() para acessar a despensa com o aquecedor de água; uma vez dentro, caminhe até a marca X dourada que se encontra no interior da despensa 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.
Depois de obter as informações sobre cada uma das 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: player.speak(x) 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 usando as constantes variáveis correspondentes aos tapetes coloridos corretos para completar o nível.