Zum Inhalt springen

Aufgabe 14 - Robust gegen alles

Zu Zen-Modus wechseln

Ein Programm, das durch keine Eingabe zum Absturz zu bringen ist: Sie fangen Exceptions gezielt, definieren eigene Exception-Klassen und bauen daraus einen Bankautomaten, der jedem Härtetest standhält (siehe Kapitel Exceptions). Das Konto aus Aufgabe 08 wird dabei auf den professionellen Stand gebracht: Statt Fehlermeldungen zu drucken, wirft es Exceptions, und der Aufrufer entscheidet über die Reaktion.

  • Kapitel Exceptions vollständig; Ihr Account aus Aufgabe 08.
  • Python, VS Code; für den Härtetest in Teil D einen Kollegen oder eine Kollegin als Testperson.
  • Sie fangen Exceptions gezielt und typspezifisch, nie pauschal.
  • Sie entwerfen eigene Exception-Hierarchien und setzen raise an Funktionsgrenzen ein.
  • Sie entscheiden begründet, auf welcher Ebene ein Fehler behandelt wird, und formulieren benutzergerechte Meldungen.
  • Reproduktion: das try/except-Muster wiedergeben und eine Validierungsschleife nach Vorlage erstellen (Teil A).
  • Reorganisation und Transfer: eine bestehende Klasse auf Exceptions umbauen und die Behandlung im Aufrufer strukturieren (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: ein Programm gegen unbekannte Eingriffe absichern, Fehlerstrategien bewerten und Transaktionssicherheit entwerfen (Teil D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

  1. Implementieren Sie ask_int(prompt, minimum, maximum): fragt so lange, bis eine gültige Ganzzahl im Bereich eingegeben wird. Der ValueError der Umwandlung wird gefangen; jede Ablehnung erklärt, was falsch war und was erwartet wird.
  2. Testen Sie mit: Buchstaben, leerer Eingabe, Zahl außerhalb des Bereichs, gültiger Zahl. Notieren Sie die vier Reaktionen.
  3. Ergänzen Sie ask_float(prompt, minimum, maximum) nach demselben Muster; Beträge wie 12.50 müssen möglich sein.
  1. Definieren Sie AccountError(Exception) und davon abgeleitet InvalidAmountError und InsufficientFundsError. Letztere transportiert den Kontostand und den angeforderten Betrag als Attribute (eigener Konstruktor mit super().__init__(...)).
  2. Bauen Sie Account um: deposit, withdraw und transfer drucken keine Meldungen mehr, sondern werfen die passenden Exceptions mit aussagekräftigem Text. Begründen Sie in zwei Kommentarsätzen, warum das die bessere Arbeitsteilung zwischen Klasse und Aufrufer ist.
  3. Zeigen Sie in einem kurzen Demo-Block: Der Aufrufer fängt beide Fehlertypen getrennt und formuliert je eine benutzerfreundliche Meldung; except AccountError fängt beide gemeinsam (Vererbung in der Fehlerbehandlung).
  1. Bauen Sie eine Konsolen-Schleife: Menü mit Einzahlen, Abheben, Kontoauszug, Beenden; alle Zahleneingaben laufen über Ihre Funktionen aus Teil A.
  2. Alle AccountError-Fälle werden im Menü behandelt; das Programm läuft danach weiter. Ein finally-Block druckt nach jedem Menüdurchlauf eine Trennlinie, unabhängig vom Ausgang.
  3. Prüfen Sie die Zuständigkeiten: In Account steht kein einziges print und kein try; sämtliche Behandlung liegt in der Menü-Schleife. Markieren Sie die Stellen, an denen Sie diese Regel bewusst eingehalten haben.

Teil D - Expertenteil: Härtetest und Transaktionssicherheit

Abschnitt betitelt „Teil D - Expertenteil: Härtetest und Transaktionssicherheit“
  1. Härtetest: Ihre Testperson darf fünf Minuten lang versuchen, den Automaten mit Eingaben zum Absturz zu bringen (Buchstaben, Leereingaben, extreme Zahlen, negative Beträge, Unsinn im Menü). Protokollieren Sie jeden Versuch und die Reaktion des Programms. Jeder Absturz wird behoben und der Versuch wiederholt.
  2. Erweitern Sie den Automaten um Überweisungen zwischen zwei Konten. Anforderung Transaktionssicherheit: Schlägt die Einzahlung nach erfolgter Abbuchung fehl, muss die Abbuchung rückgängig gemacht werden; unter keinen Umständen darf Geld verschwinden. Entwerfen Sie die Lösung (Reihenfolge der Prüfungen? Rollback im except?) und dokumentieren Sie Ihre Entscheidung.
  3. Diskutieren Sie in drei Sätzen, warum except Exception: pass im Automaten jeden einzelnen Test aus Punkt 1 “bestehen” würde und trotzdem die schlechteste aller Lösungen ist.
  4. Formulieren Sie eine Regel dafür, wo in einem Programm mit mehreren Schichten (Klasse, Menü, Eingabefunktionen) welche Fehler behandelt werden, und belegen Sie sie mit je einem Beispiel aus Ihrem Code.
  1. Warum sind Exceptions Rückgabewerten wie -1 überlegen? Nennen Sie zwei der drei Gründe aus dem Kapitel.
  2. Was ist an einem nackten except: gefährlich?
  3. Wozu dient die gemeinsame Basisklasse AccountError, wenn es ohnehin spezifische Fehlerklassen gibt?
  4. Wann läuft ein finally-Block, und wofür ist er gedacht?
  5. Eine Hilfsfunktion tief im Programm stellt einen ungültigen Wert fest. Fangen oder werfen? Begründen Sie.

robust.py (Eingabefunktionen und Bankautomat), account.py (umgebaut, mit Exception-Hierarchie) und das Härtetest-Protokoll aus Teil D.