Fortgeschrittener Python-Entwicklungskurs
Kapitel
>
Stufe
Ausnahmebehandlung
Anpassen von Ausnahme-Klassen
Ziel
Überprüfe das gesammelte Regenwasser und stelle sicher, dass es korrekt verarbeitet und weitergeleitet wird, indem du Ausnahme-Klassen anpasst.
Am anderen Ende des Dachkomplexes befindet sich eine Zisterne mit gesammeltem Regenwasser. Dieses Wasser wird gefiltert und im gesamten Gebäude für verschiedene Zwecke verteilt. Einige Ventile an der oberen Wand regulieren den Wasserfluss, während im letzten Lagerraum verschiedene Wassererhitzer untergebracht sind. Der Betrieb der Maschinen kann heikel sein, doch ihre Arbeitsweise kann effektiv optimiert werden, indem Fehlercodes definiert und wirksame Gegenmaßnahmen ergriffen werden. Dies erreicht man, indem man Ausnahme-Klassen erstellt, die für eigene Fehlermeldungen verwendet werden.
Es sind zwei benutzerdefinierte Ausnahme-Klassen im Code-Editor eingerichtet, deren Verwendung entscheidend ist, um etwaige Maschinenprobleme zu beheben. Die erste Ausnahme dient zur Fehlersuche bei Wasserdruckproblemen. Sie soll in Verbindung mit den Ventilen eingesetzt werden, um sicherzustellen, dass das Wasser ordnungsgemäß in den Komplex fließt oder ob der Druck angepasst werden muss. Je nachdem, ob der Druck unter 100 oder über 300 liegt, wird durch die Ausnahme eine unterschiedliche Aktion veranlasst. Der Druck wird als Argument übergeben, das der Benutzer angeben muss. Sobald sie ausgelöst wird, erscheint ein benutzerdefiniertes Pop-up mit einem Fehlercode und einer Nachricht.
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")
Die zweite benutzerdefinierte Ausnahme-Klasse soll die Temperatur in den Wassererhitzern regeln. Wenn die Temperatur zu niedrig oder zu hoch ist, musst du eine neue Temperatur als Argument eingeben, um den Fehler zu beheben, sobald er auftritt.
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")
Um zu beginnen, gehe zum leuchtenden X-Marker über dem grünen Teppich und wende dich dem Tank mit einem Ventil zu. Es gibt vier (4) dieser Ventile, die den Druck des Wassers steuern, das aus der Zisterne gepumpt wird. Es existieren vier (4) variable Konstanten: green_pressure, red_pressure, blue_pressure und orange_pressure. Diese speichern den Druck jedes Tanks, der dem entsprechenden farbigen Teppich zugeordnet ist.
An allen leuchtenden X-Markierungen verwendest du die Code-Block-Sequenzen try / except und else, um zu überprüfen, ob der Druck in jedem Tank angemessen ist. Wenn der Druck unter 100 liegt oder über 300 ist, löse die benutzerdefinierte PressureError-Ausnahme aus und übergebe den Druck als Argument. Wird sie aktiviert, zeigt sie den Fehlercode an und leitet eine Korrektur ein, andernfalls wird der else-Block ausgeführt, der bestätigt, dass der Druck im Tank in Ordnung ist. Zum Beispiel:
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" )
Führe dies an allen leuchtenden X-Markierungen aus, verwende dabei die variablen Konstanten, die den farbigen Teppichen entsprechen, und überprüfe bzw. passe die Druckventile nach Bedarf an.
Sobald du fertig bist, gehe zum goldenen X-Marker und verwende die Funktion open(), um den Lagerraum mit dem Wassererhitzer zu betreten. Sobald du drinnen bist, gehe zum goldenen X-Marker im Lagerraum und nutze die Funktion read(), um das Memo auf der Theke zu lesen. Dieses Memo liefert dir Informationen darüber, welche ideale Temperatur für jeden der Wassererhitzer gilt.
Nachdem du die Informationen zu den Temperaturen hast, gehe zum dunklen X-Marker über dem violetten Teppich. Hier verwenden wir die Code-Sequenz try / except und else, um zu überprüfen, ob die Wassererhitzer die richtige Temperatur haben. Es gibt vier (4) zusätzliche variable Konstanten, die den farbigen Teppichen zugeordnet sind: purple_temperature, yellow_temperature, pink_temperature und white_temperature.
In der Sequenz überprüfen wir, ob die Temperatur unter 100 liegt. Falls dies der Fall ist, lösen wir die TemperatureError-Ausnahme aus. Als benutzerdefinierte Ausnahme nimmt sie ein Argument entgegen, in diesem Fall musst du die im Memo abgelesene Temperatur eingeben, um die Gegenmaßnahme der Ausnahme korrekt auszuführen. Zum Beispiel:
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" )
Führe dies für alle Wassererhitzer aus. An jedem X-Marker, während du den Erhitzern zugewandt bist, führe die Sequenz unter Verwendung der variablen Konstanten, die den entsprechenden farbigen Teppichen zugeordnet sind, aus, um das Level abzuschließen.