Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Wann immer während <strong>der</strong> Ausführung des normalen Rumpfes eine Ausnahme auftritt, dann wird diese<br />
Ausführung angehalten und stattdessen die Anweisung Ausnahmebehandlung ausgeführt. Innerhalb dieser<br />
Klausel (und nirgendwo an<strong>der</strong>s) darf die Anweisung retry ausgeführt werden, welche einen Neustart des Anweisungsteils<br />
<strong>der</strong> Routine auslöst. So könnte zum Beispiel die oben erwähnte fehlerhafte Eingabe so gerettet<br />
werden, daß <strong>der</strong> Benuzter auf die korrekte Syntax hingewiesen wird und dann erneut die Eingabe gelesen<br />
wird(, bis irgendwann einmal <strong>der</strong> Geduldsfaden reißt).<br />
numerische eingabe lesen:REAL is<br />
do<br />
message("bitte eine REAL-Zahl eingeben");<br />
io.readreal<br />
Result := io.lastreal<br />
rescue<br />
message("REAL-Syntax: d.d o<strong>der</strong> d.dEd o<strong>der</strong> d.dE-d");<br />
retry<br />
end<br />
Zuweilen fällt die Ausnahmebehandlung aufwendiger aus als die eigentliche Routine. So könnte man in <strong>der</strong><br />
Routine numerische eingabe lesen erst ab dem zweiten Fehlversuch die Syntax angeben und die Anzahl<br />
<strong>der</strong> Fehlversuche begrenzen. Der Anweisungsteil bleibt davon jedoch völlig unberührt und somit liegt eine<br />
klare Trennung von <strong>der</strong> eigentlich vorgesehenen Ausführung und <strong>der</strong> Behandlung von Fehlern vor – sowohl<br />
im Programmtext als auch während des Ablaufs, in dem im Normalfall die rescue-Klausel keine Rolle spielt. 33<br />
Nur, wenn nach einer Ausnahmesituation ein retry erfolgreich war, kann <strong>der</strong> Vertrag einer Routine erfüllt<br />
werden. An<strong>der</strong>nfalls muß sie scheitern. Daher scheitert eine Routinenausführung stets dann, wenn die rescue-<br />
Klausel bis zum Ende ausgeführt wurde, und dem Aufrufer wird das Fehlverhalten mittels einer Ausnahmesituation<br />
mitgeteilt. 34 Im schlimmsten Fall pflanzt sich die Ausnahmesituation durch alle Aufrufe zurück bis<br />
zur Wurzelklasse und beendet dort die Programmausführung.<br />
Bezüglich Korrektheit gelten für die rescue-Klausel an<strong>der</strong>e Anfor<strong>der</strong>ungen als für den normalen Anweisungsteil<br />
einer Routine. Zum einen braucht die rescue-Klausel nicht die Nachbedingung <strong>der</strong> Routine zu erfüllen,<br />
denn ihre Aufgabe ist ja nur, eine Ausnahmesituation einem geordneten Ende entgegenzuführen o<strong>der</strong> eine<br />
Wie<strong>der</strong>aufnahme des Anweisungsteils vorzubereiten. Die Nachbedingung einer rescue-Klausel besteht also nur<br />
aus <strong>der</strong> Klasseninvarianten und ggf. <strong>der</strong> Vorbedingung <strong>der</strong> Routine, falls retry aufgerufen wird. Zum an<strong>der</strong>en<br />
aber muß die rescue-Klausel in jedem Falle fehlerfrei arbeiten. Ihre Vorbedingung ist daher immer true.<br />
Definition 4.3.10 (Korrektheit von Ausnahmebehandlungen)<br />
Innerhalb einer Klasse K mit Invariante INV heißt eine Routine r genau dann Ausnahme-korrekt, wenn<br />
für alle gültigen Argumente xr und jeden Zweig b ihres rescue-Blocks gilt<br />
– { true} b { INV ∧ prer(xr)} , falls b mit retry endet<br />
– { true} b { INV} , falls b ohne retry endet<br />
Die Ausnahme-Korrektheit kann mit den bisher bekannten Verifikationsregeln bewiesen werden.<br />
4.3.8 Debugging<br />
Während <strong>der</strong> Entwicklung und Erprobung eines Programms läßt man sich üblicherweise eine Reihe von<br />
Testdaten ausgeben, um auf Fehlern schneller auf die Spur zu kommen. Dies ist beson<strong>der</strong>s hilfreich bei<br />
den unvermeidlichen Tippfehler beim Erstellen des Programmtextes, die man auch bei einem gründlichen<br />
33 Weitere Beispiele für einen sinnvollen Einsatz <strong>der</strong> Ausnahmebehandlung findet man in [Meyer, 1988, Kapitel 7.10.4/5]<br />
34 Fehlt die rescue-Klausel, so wird beim Übersetzen vom Compiler die Klausel “rescue default rescue” eingesetzt. Die<br />
Prozedur default rescue (<strong>der</strong> Klasse ANY) hat normalerweise keinerlei Wirkung und bewirkt einen sofortigen Abbruch. Sie<br />
kann aber redefiniert werden, falls für ein System eine bestimmte Standardausnahmenbehandlung gewünscht wird.