Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom

Obsługa wyjątków
Dostosowywanie klas wyjątków

Cel

Zweryfikuj zebraną wodę deszczową oraz upewnij się, że jest prawidłowo przetwarzana i przesyłana, poprzez dostosowywanie klas wyjątków.

Na końcu kompleksu dachowego znajduje się zbiornik na zebraną wodę deszczową, która jest filtrowana i przepompowywana przez cały budynek do różnych celów. Niektóre zawory na górnej ścianie kontrolują ciśnienie przepływającej wody, natomiast ostatni magazyn mieści różne podgrzewacze wody. Obsługa maszyn może być trudna, jednak ich działanie można skutecznie usprawnić poprzez określenie kodów błędów oraz wdrożenie odpowiednich środków zaradczych. Osiąga się to przez dostosowywanie klas wyjątków, które tworzysz dla swoich niestandardowych wyjątków.

W edytorze kodu ustawione są dwie niestandardowe klasy wyjątków – Twoja zdolność do ich użycia będzie niezbędna przy rozwiązywaniu problemów z maszynami, które napotkasz. Pierwsza to wyjątek służący do diagnozowania problemów z ciśnieniem wody. Ma być wykorzystywana wraz z zaworami, aby zapewnić prawidłowy przepływ wody w kompleksie lub w celu regulacji ciśnienia. W zależności od tego, czy ciśnienie jest poniżej 100 lub powyżej 300, wyjątek podejmuje różne działania. Ciśnienie jest argumentem, który użytkownik musi podać. Po wywołaniu, wyświetlane jest niestandardowe okno z kodem błędu i komunikatem.

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")

Druga niestandardowa klasa wyjątków służy do modulowania temperatury w podgrzewaczach wody. Jeśli temperatura jest zbyt niska lub zbyt wysoka, musisz podać nową temperaturę jako argument, aby naprawić błąd w momencie jego wystąpienia.

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")

Na początek przejdź do lekkiego znaku X nad zielonym dywanem i skieruj się w stronę zbiornika z zaworem, których jest cztery (4) i które regulują ciśnienie wody pompowanej ze zbiornika. Istnieją cztery stałe zmienne: green_pressure, red_pressure, blue_pressure oraz orange_pressure, które przechowują ciśnienie w poszczególnych zbiornikach odpowiadających kolorom dywanów.

Na wszystkich lekkich znakach X użyj sekwencji bloków kodu try/except oraz else, aby sprawdzić, czy ciśnienie w każdym zbiorniku jest odpowiednie. Jeśli ciśnienie jest poniżej 100 lub powyżej 300, zgłoś niestandardowy wyjątek PressureError i podaj ciśnienie jako argument. Gdy wyjątek zostanie aktywowany, wyświetli kod błędu i zaproponuje korektę, w przeciwnym razie wywoła się klauzula else, potwierdzająca, że ciśnienie w zbiorniku jest prawidłowe. Na przykład:

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" )

Wykonaj to na wszystkich lekkich znakach X, używając stałych zmiennych odpowiadających odpowiednim kolorom dywanów, aby zweryfikować lub dostosować zawory ciśnienia według potrzeb.

Gdy ukończysz, przejdź do złotego znaku X i użyj funkcji open(), aby uzyskać dostęp do magazynu z podgrzewaczem wody. Po wejściu, przejdź do złotego znaku X znajdującego się wewnątrz magazynu i użyj funkcji read(), aby odczytać notatkę na ladzie. Notatka ta dostarczy Ci informacji o idealnej temperaturze dla każdego z podgrzewaczy wody.

Gdy zdobędziesz informacje o temperaturach, przejdź do ciemnego znaku X nad fioletowym dywanem. Tutaj użyjemy sekwencji kodu try/except oraz else, aby zweryfikować, czy podgrzewacze wody mają odpowiednią temperaturę. Istnieją kolejne cztery stałe zmienne związane z kolorami dywanów: purple_temperature, yellow_temperature, pink_temperature oraz white_temperature.

W tej sekwencji sprawdzimy, czy temperatura jest poniżej 100. Jeśli tak, zgłosimy wyjątek TemperatureError. Jako niestandardowy wyjątek, przyjmuje on argument – w tym przypadku musisz podać temperaturę odczytaną z notatki, aby prawidłowo uruchomić środek zaradczy wyjątku w celu naprawy błędu. Na przykład:

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" )

Wykonaj to dla wszystkich podgrzewaczy wody. Przy każdym znaku X, stojąc naprzeciw podgrzewaczy, wykonaj sekwencję, używając odpowiednich stałych zmiennych odpowiadających kolorom dywanów, aby ukończyć poziom.

Księga Kodów