next up previous
Nächste Seite: Traditionelle Techniken Aufwärts: Ausnahmenbehandlungen Vorherige Seite: Ausnahmenbehandlungen

Einführung

Eine Reihe von Programmiersprachen (z.B. C++ und Eiffel) offerieren Ausnahmenbehandlungen (exception handling) als Kontrollstruktur für die Behandlung von Laufzeitfehlern, Betriebssystemsfehlern und Fehlern, die von der Bibliothek selbst entdeckt werden. Einige der Sprachen verwenden Ausnahmenbehandlungen auch für asynchrone Ereignisse. Traditionelle Techniken sehen die explizite Rückgabe von Fehlerindikationen bei Prozeduraufrufen vor (z.B. C) oder die Abbildung von Fehlerentdeckungen auf Ereignisse, für die es einen Interessenten gibt, der typischerweise nach der Ausgabe der Fehlermeldung das Programm abbricht oder wieder in einen konsistenten Zustand überführt (z.B. PostScript).

Folgt man Bertrand Meyer, so kann das Aufrufen einer importierten Prozedur unter dem Gesichtspunkt eines Vertrags betrachtet werden, bei dem

(V1)
der aufrufende Klient Parameter und einen Zustand vorzuliefern hat, der die Vorbedingung der Prozedur erfüllt, worauf
(V2)
die aufgerufene Prozedur sich verpflichtet, einen Zustand und ggf. Rückgabewerte zurückzuliefern, die der Nachbedingung entsprechen.

Obwohl es sich um den Aufruf von Prozeduren handelt, sind die Parteien eines Kontrakts Module, wobei die Schnittstellen als Verträge dienen, die durch den Import akzeptiert werden.

Es gibt eine Reihe von typischen Fällen, in denen eine der beiden Parteien den Vertrag nicht hält bzw. nicht halten kann:

Zusammengefaßt läßt sich entsprechend der Verletzung von (V1) oder (V2) zwischen Ausfällen aufgrund einer nicht erfüllten Vorbedingung (domain failure) und Ausfällen aufgrund der Unmöglichkeit, die Nachbedingung zu gewährleisten (range failure), unterscheiden.

Während eines Programmlaufs führen Fehler zu Vertragsverletzungen und damit zu Ausfällen. Ausfälle ergeben Ausnahmesituationen, die bei Entdeckung einer Ausnahmenbehandlung unterzogen werden. Fehler sind zum einen statische Programmierfehler (z.B. falls ``i $:=$ i $+$ j'' getippt worden ist, wenn ``i $:=$ i $-$ j'' korrekt gewesen wäre. Zum anderen ist es durchaus üblich, mit Fehlern zu leben, wenn Vorbedingungen nicht im voraus garantiert werden können. Auch wenn die Vorbedingung eines Übersetzers festlegt, daß die Eingabedatei der Syntax und Semantik einer bestimmten Programmiersprache genügen muß, so wird trotzdem erwartet, daß der Übersetzer robust ist und Fehlermeldungen ausgeben kann. Diese Terminologie leitet sich von Flaviu Cristian ab, der hierfür präzise mathematische Definitionen gegeben hat.

Um die Korrektheit eines Software-Systems zu gewährleisten, ist es notwendig, daß Operationen entweder ihren Vertrag erfüllen oder unüberhörbar einen Ausfall signalisieren. Statt einen Ausfall als Verletzung von (V2) zu betrachten, könnte man (V2) zu (V2') erweitern:

(V2')
Die aufgerufene Prozedur verpflichtet sich, einen Zustand und ggf. Rückgabewerte zurückzuliefern, die der Nachbedingung entsprechen. Bei Verletzung der Vorbedingung ist ein Ausfall zu signalisieren.

Eine Prozedur, die (V2') für alle möglichen Anfangszustände erfüllt, ist robust. Ihr Verhalten ist immer vorhersehbar, selbst wenn der Aufrufer seinen Teil am Vertrag nicht erfüllt.


next up previous
Nächste Seite: Traditionelle Techniken Aufwärts: Ausnahmenbehandlungen Vorherige Seite: Ausnahmenbehandlungen
Andreas Borchert 2000-12-18