9. Ausnahmen und Ausnahmebehandlung | ||||||
|
||||||
9.2 Ausnahmebehandlung
Die Behandlung von Ausnahmen wird jeweils am Ende eines Blocks, Unterprogramms, Ablaufteil eines Paketrumpfs oder am Ende von Prozessen angegeben. Ein Ausnahmebehandler beginnt mit dem Wort "exception" , darauf folgen die Anweisungen, die bei Ausnahmen ausgeführt werden sollen. In einem Ausnahmebehandler können eine, mehrere oder alle Ausnahmen abgefangen werden. Wenn einzelne Ausnahmen abgefangen werden sollen, können mehrere "when"-Abfragen nacheinander auftreten. Gruppen von Ausnahmen können in einer Abfrage enthalten sein; dazu werden sie mit "|" getrennt. Wenn nichtbenannte Ausnahmen abgefangen werden sollen, kann dies mit "when others" erfolgen. Syntax eines Blocks mit Ausnahmebehandlung
Beispiel: Ohne Ausnahmebehandlung würde im folgenden Beispiel in den jeweils gekennzeichneten Situationen die Ausnahme zum Abbruch des Programmes führen. -- Dieses Programm muss mit der Übersetzeroption -gnato uebersetzt werden!
Ausnahmen können sowohl während der Deklaration oder Initialisierung von Variablen als auch innerhalb von Ausnahmebehandlern auftreten. Während der Deklaration oder Initialisierung von Variablen können Ausnahmen auftreten. Diese können nicht von dem Ausnahmebehandler innerhalb dieses Blocks, Unterprogramms oder Pakets abgefangen werden, da der Ausnahmebehandler dieser Programmeinheit auf Objekte zurückgreifen könnte, die noch nicht elaboriert sind. So könnte innerhalb des Ausnahmebehandlers wiederum eine Ausnahme ausgelöst werden, die an die nächsthöhere Ebene weitergeleitet würde. Um daraus resultierende Gefahren zu umgehen, wird die Ausnahme gleich an die aufrufende Programmeinheit weitergeleitet. Der Ausnahmebehandler ist dadurch erst nach der Elaboration des Deklarationsteils ausführbar. Wenn z. B. im Deklarationsteil eines Pakets eine Variable vom Typ Positive definiert wird und dieser eine Integer-Variable mit dem Wert 0 zugewiesen wird, wird innerhalb des Deklarationsteils die Ausnahme Constraint_Error ausgelöst, da 0 außerhalb des Definitionsbereichs von Positive (1 bis Integer'Last) liegt.
Überall wo Anweisungen stehen, können Ausnahmen auftreten. Somit besteht auch die Möglichkeit, daß innerhalb des Ausnahmebehandlers eine Ausnahme auftritt. Die Ausnahme wird gemäß Voreinstellung an die nächsthöhere Ebene weitergereicht. Löst eine Anweisung im Inneren eines Blocks oder einer Programmeinheit eine Ausnahme aus, dann wird die Abarbeitung abgebrochen und mit dem Ausnahmebehandler fortgesetzt. Nachdem die zu der aufgetretenen Ausnahme gehörenden Anweisungen ausgeführt sind, wird die Programmabarbeitung in der aufrufenden Programmeinheit bzw. im umgebenden Block fortgesetzt. Die Anweisungen im Ausnahmebehandler sollten für eine kontrollierte Beendigung des ausnahme-auslösenden Blocks bzw. der Programmeinheit sorgen. Ist kein Ausnahmebehandler vorhanden oder wird die Ausnahme nicht abgefangen, so wird auf der nächsthöheren Ebene, der aufrufenden Programmeinheit, nach dem betreffenden Ausnahmebehandler gesucht. Ein Unterprogramm z. B. gibt den Fehler/die Ausnahme an den Aufrufer weiter. Die Ausnahme wird also sukzessive hochgereicht, bis entweder die Ausnahme behandelt wird oder die oberste Ebene (das Hauptprogramm) erreicht ist. Eine unbehandelte Ausnahme im Hauptprogramm, die entweder hier ausgelöst oder aber bis hierhin durchgereicht wurde, beendet das Programm. Die Ausnahmebehandlung sollte auf echte Fehlerfälle beschränkt und nicht als Ersatz für normale Steuerstrukturen mißbraucht werden. |
||||||
|