22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!