Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m320_2024:learningunits:lu05:ausloesen [2026/08/30 14:05] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m320_2024:learningunits:lu05:ausloesen [2026/08/30 14:06] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden msuter | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU05c - Eigene Exceptions auslösen ====== | ||
| + | Wie erwähnt, sind es oft Benutzereingaben, | ||
| + | Dazu folgendes Beispiel. | ||
| + | |||
| + | ==== Beispiel: Personendaten erfassen ==== | ||
| + | |||
| + | In eine Eingabefeld kann die Körpergrösse eines Menschen eingegeben werden.\\ | ||
| + | {{modul: | ||
| + | //Abb: Eingabe mit begrenztem Wertebereich // | ||
| + | |||
| + | Es ist klar ersichtlich, | ||
| + | Diese Situation kann übewacht und mit einem eigenen Fehlertyp (z.B. BodySizeError) signalisiert werden. | ||
| + | |||
| + | |||
| + | ===== Warum wirft man eigene Exception? ===== | ||
| + | |||
| + | Ein Fehler stellt immer eine Ausnahme im Ablauf des Programms dar. | ||
| + | Natürlich könnte man z.B. den Wert -1 (bei Zahlen) oder ein Leerzeichen als Fehlercode zurückgeben. | ||
| + | Aber was, wenn eben auch negative Werte zulässig sind? | ||
| + | |||
| + | Dieses Beispiel haben wir in der [[../ | ||
| + | Dort darf der Saldo ('' | ||
| + | Aber welcher negative Wert soll dann einen Fehler signalisieren? | ||
| + | Es ist also um vieles besser, wenn im Fehlerfall ein entsprechendes Fehlerobjekt erzeugt und geworfen wird. | ||
| + | Auf dieses Fehlerobjekt kann dann an anderer Stelle im Code mittels '' | ||
| + | |||
| + | ==== Beispiel: Körpergrösse überwachen ==== | ||
| + | |||
| + | <code python> | ||
| + | class BodySizeError(Exception): | ||
| + | """ | ||
| + | Dieser Fehlerfall wird ausgelöst, wenn die vom | ||
| + | Benutzer eingegebene Körpergrösse nicht im Bereich | ||
| + | 20...250 cm liegt. | ||
| + | """ | ||
| + | def __init__(self, | ||
| + | super().__init__(f' | ||
| + | |||
| + | |||
| + | class Person(): | ||
| + | def __init__(self, | ||
| + | self._name = name | ||
| + | self._body_size = 0 | ||
| + | |||
| + | @property | ||
| + | def body_size(self): | ||
| + | return self._body_size | ||
| + | |||
| + | @body_size.setter | ||
| + | def body_size(self, | ||
| + | if 50 <= size <= 250: | ||
| + | self._body_size = size | ||
| + | else: | ||
| + | raise BodySizeError(size) | ||
| + | |||
| + | if __name__ == ' | ||
| + | jonathan = Person(' | ||
| + | try: | ||
| + | size = int(input(' | ||
| + | jonathan.body_size = size | ||
| + | except BodySizeError as body_size_error: | ||
| + | print(body_size_error) | ||
| + | # OK hier gehts weiter | ||
| + | print(' | ||
| + | </ | ||
| + | |||
| + | Kopieren Sie den Code in Ihre Entwicklungsumgebung und setzen Sie einige Breakpoints. | ||
| + | Starten Sie den Debugger und probieren ein paar Eingabewerte aus. | ||
| + | Schauen Sie, was der jeweilge Effekt ist. | ||
| + | |||
| + | ===== Eigene Exception erstellen ===== | ||
| + | |||
| + | Im Folgenden betrachten wir die Codesequenzen, | ||
| + | |||
| + | ==== Deklaration ==== | ||
| + | Die Deklaration der eigenen Fehlerklasse als Ableitung der Klasse '' | ||
| + | <code Python> | ||
| + | class BodySizeError(Exception): | ||
| + | # Vererbung der Eigenschaften der Klasse Exception an die Klasse BodySizeError | ||
| + | </ | ||
| + | |||
| + | Das Thema Vererbung werden Sie erst im Detail kennenlernen. | ||
| + | Dennoch brauchen wir diese Technik hier, um eine eigene Exception-Klasse zu erstellen. | ||
| + | |||
| + | ==== Konstruktor der Oberklasse ==== | ||
| + | |||
| + | In der Regel verwendet man den Konstruktor der Oberklasse, um das Objekt vollständig zu initialisieren. | ||
| + | <code Python> | ||
| + | def __init__(self, | ||
| + | super().__init__(f' | ||
| + | # Aufruf des super-Konstruktors mit den entsprechenden Parametern. | ||
| + | </ | ||
| + | |||
| + | Anhand der Dokumentation wissen wir, dass die Klasse '' | ||
| + | Es ist also wichtig, an Hand einer Dokumentation die Funktionalität der Oberklasse in Erfahrung zu bringen. | ||
| + | |||
| + | ==== Auslösen der Exception ==== | ||
| + | |||
| + | <code Python> | ||
| + | if 50 <= size <= 250: | ||
| + | self._body_size = size | ||
| + | else: | ||
| + | raise BodySizeError(size) | ||
| + | # hier wird das Fehlerobjekt erzeugt und " | ||
| + | </ | ||
| + | |||
| + | Mittels einer Bedingung wird die Gültigkeit eines Wertes überprüft. | ||
| + | Im Fehlerfall wird durch '' | ||
| + | Im Code ist ersichtlich, | ||
| + | Das heisst, dass in diesem Moment der Programmausfürhung ein entsprechendes Objekt erzeugt wird. (vrgl dazu die Skizze unten) | ||
| + | |||
| + | ==== Fehler fangen und verarbeiten ==== | ||
| + | <code Python> | ||
| + | except BodySizeError as body_size_error: | ||
| + | # das geworfene Objekt vom Typ BodySizeError benennen | ||
| + | print(body_size_error) | ||
| + | </ | ||
| + | |||
| + | Wir geben bei '' | ||
| + | Anschliessend codieren wir das gewünschte Verhalten unseres Programms, wenn der Fehlertyp auftreten sollte. | ||
| + | |||
| + | ==== Ablauf im Code ==== | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb: Ablauf bei einer Exception// | ||
| + | |||
| + | ---- | ||
| + | {{tag> | ||
| + | [[https:// | ||
| + | |||