Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň

Zpracování výjimek
Přizpůsobení tříd výjimek

Cíl

Ověřit, že nasbíraná dešťová voda je zpracována a přenášena správně pomocí přizpůsobení výjimečných tříd.

Na opačném konci střešní budovy se nachází nádrž na nasbíranou dešťovou vodu, která je filtrovaná a přenášená do celé budovy pro různé účely. Několik ventilů na horní stěně reguluje tlak tekoucí vody, zatímco poslední skladovna ukrývá různé ohřívače vody. Provoz strojů může být komplikovaný, nicméně jejich fungování lze efektivně zjednodušit vyznačením chybových kódů a nastavením účinných protiopatření. Toho se dosahuje přizpůsobením výjimečných tříd, které vytvoříte pro své vlastní výjimky.

V kódovém editoru jsou nastaveny dvě vlastní třídy výjimek, jejich použití bude klíčové při odstraňování problémů s provozem strojů, na které narazíte. První je výjimka pro odstraňování problémů s tlakem vody. Je určena k použití s ventily, aby se ověřilo, že voda správně proudí do komplexu nebo zda je třeba tlak upravit. V závislosti na tom, jestli je tlak pod hodnotou 100 nebo nad 300, výjimka provede jinou akci. Tlak je argument, který uživatel musí zadat. Jakmile je výjimka vyvolána, zobrazí se vlastní vyskakovací okno s chybovým kódem a zprávou.

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

Druhá vlastní třída výjimek je určena k nastavování teploty v ohřívačích vody; pokud je teplota příliš nízká nebo příliš vysoká, musíte zadat novou teplotu jako argument, aby se chyba opravila, jakmile nastane.

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 začátek se vydejte k lehkému X značce přes zelený koberec a postavte se čelem k nádrži s ventilem, kterých je čtyři (4) a regulují tlak vody čerpané z nádrže. Existují čtyři (4) proměnné konstanty: green_pressure, red_pressure, blue_pressure a orange_pressure, které obsahují tlak každé ze zbývajících nádrží odpovídajících barevným kobercům.

Na všech lehkých X značkách použijte bloky kódu try/except a else k ověření, zda je tlak v každé nádrži vhodný. Pokud je tlak pod hodnotou 100 nebo nad 300, vyvolejte vlastní výjimku PressureError a předejte jí tlak jako argument. Pokud je výjimka aktivována, zobrazí se chybový kód a provedou se korekční opatření, jinak se spustí klauzule else potvrzující, že tlak v nádrži odpovídá požadavkům. Například:

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

Proveďte to na všech lehkých X značkách, použijte proměnné konstanty, které odpovídají jednotlivým barevným kobercům, a podle potřeby ověřte nebo nastavte tlak ventilů.

Jakmile to dokončíte, vydejte se ke zlaté X značce a použijte funkci open() pro vstup do skladovny s ohřívačem vody. Jakmile jste uvnitř, vydejte se ke zlaté X značce, která se nachází ve skladovně, a použijte funkci read() pro přečtení interního oznámení na pultu. Toto oznámení vám poskytne informace o ideální teplotě pro každý z ohřívačů vody.

Jakmile získáte informace o jednotlivých teplotách, vydejte se ke tmavé X značce přes fialový koberec. Zde použijeme sekvenci kódu try/except a else k ověření, zda mají ohřívače vody správnou teplotu. Existují další čtyři (4) proměnné konstanty spojené s barevnými koberci: purple_temperature, yellow_temperature, pink_temperature a white_temperature.

V této sekvenci ověříme, zda je teplota pod hodnotou 100. Pokud ano, vyvoláme výjimku TemperatureError. Jako přizpůsobená výjimka přijímá argument, v tomto případě musíte zadat teplotu přečtenou z oznámení, aby mohla být správně provedena nápravná opatření. Například:

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

Proveďte toto u všech ohřívačů vody. Na každé X značce a při pohledu směrem k ohřívačům spusťte sekvenci s použitím proměnných konstant odpovídajících správným barevným kobercům, abyste dokončili úroveň.

Kniha Kódu