Avansert Pythonutviklingskurs
Kapittel
>
Nivå

Unntakshåndtering
Tilpasse unntaksklasser

Mål

Verifiser at det oppsamlede regnvannet blir behandlet og overført korrekt ved å tilpasse unntaksklasser.

På den ytterste enden av takkomplekset finnes en tank for oppsamlet regnvann; dette vannet blir filtrert og fordelt gjennom bygningen til ulike formål. Noen ventiler på den øvre veggen kontrollerer vanntrykket, mens det siste lagerrommet huser ulike varmtvannsberedere. Drift av maskiner kan være utfordrende, men driften kan effektiviseres ved å definere feilkoder og sette opp effektive tiltak. Dette oppnås ved å tilpasse unntaksklasser som du oppretter for dine egendefinerte unntak.

Det er to egendefinerte unntaksklasser opprettet i kodeeditoren, og din evne til å bruke dem vil være essensiell for feilsøking av eventuelle maskinproblemer du støter på. Den første er et unntak for å feilsøke vanntrykk. Den er ment å brukes sammen med ventilene for å sikre at vannet flyter korrekt inn i komplekset eller at trykket eventuelt må justeres. Avhengig av om trykket er under 100 eller over 300 iverksettes en annen handling av unntaket; trykket er et argument som brukeren må oppgi. Når den trigges vises en egendefinert popup med en feilkode og melding.

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

Den andre egendefinerte unntaksklassen er ment å regulere temperaturen i varmtvannsberederne. Hvis temperaturen er for lav eller for høy, må du oppgi en ny temperatur som et argument for å rette feilen når den oppstår.

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

For å starte, gå til det lyse X-merket over den grønne teppet og se mot tanken med en ventil; det er fire (4) slike som regulerer trykket av vannet som pumpes fra tanken.

Det finnes fire (4) variable konstanter: green_pressure, red_pressure, blue_pressure og orange_pressure. Disse inneholder trykket i hver av tankene til de tilsvarende fargede teppene.

På alle de lyse X-merkene, bruk try/except og else kodeblokksekvensene for å verifisere om trykket i hver tank er passende. Hvis trykket er under 100 eller over 300, skal du kaste det egendefinerte PressureError unntaket og legge til trykket som et argument. Hvis aktivert, vil det utløse feilkoden og igangsette en korreksjon, ellers blir else-blokken kjørt, noe som bekrefter at trykket i tanken er passende. For eksempel:

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

Gjør dette for alle de lyse X-merkene, ved å bruke de variable konstantene som tilsvarer hvert av de fargede teppene, og enten verifiser eller juster trykkventilene etter behov.

Når du er ferdig, gå til det gullfargede X-merket og bruk open()-funksjonen for å få tilgang til lagerrommet med varmtvannsberederen. Når du er inni, gå til det gullfargede X-merket som er inne i lagerrommet og bruk read()-funksjonen for å lese notatet på disken. Dette notatet vil gi deg informasjon om hva den ideelle temperaturen for hver av varmtvannsberederne er.

Når du har informasjonen om hver av temperaturene, gå til det mørke X-merket over den lilla teppet. Her vil vi bruke try/except og else kodefølgen for å verifisere at varmtvannsberederne har riktig temperatur. Det finnes fire (4) flere variable konstanter knyttet til de fargede teppene: purple_temperature, yellow_temperature, pink_temperature og white_temperature.

I denne sekvensen vil vi verifisere om temperaturen er under 100. Hvis den er det, vil vi kaste TemperatureError unntaket. Som et tilpasset unntak, tar det et argument. I dette tilfellet må du oppgi temperaturen som er lest fra notatet for å korrekt gjennomføre unntakets tiltak for å rette opp problemet. For eksempel:

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

Gjør dette for alle varmtvannsberederne. På hvert X-merke, mens du vender mot berederne, kjør sekvensen ved å bruke de variable konstantene som tilsvarer de riktige fargede teppene for å fullføre nivået.

Kodebok