9. Ausnahmen und Ausnahmebehandlung
 
zurück
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

declare
   -- Vereinbarung
begin
   -- Anweisung
   --...
exception
   when Fehlerbezeichnung =>
      -- Anweisungen

   --...
end;


begin
   -- ...
exception
   when Constraint_Error =>
      -- Anweisungen
      -- ...
   when Program_Error | Tasking_Error =>
      -- Anweisungen
      -- ...
   when others =>
      -- Anweisungen
      -- ...
end;

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!

with Text_IO;
procedure Div3 is
   Dividend, Divisor, Durchlaeufe : Integer ;
   Korrekte_Eingabe : Boolean;

   package Int_IO is new Text_IO.Integer_IO (Integer);

begin
   Text_IO.Put_Line ("Programm Division 3");
   Text_IO.New_Line;
   Text_IO.Put_Line ("Das Programm erwartet ein Zahlenpaar (a,b) und");
   Text_IO.Put_Line ("berechnet a/b . Bitte testen Sie die " & " Ausnahmebehandlung,");
   Text_IO.Put_Line ("indem Sie fuer b den Wert 0 angeben!");
   Text_IO.New_Line;
   loop
      begin
         Text_IO.Put_Line ("Wieviele Durchlaeufe (max 10) ?");
         Int_IO.Get (Durchlaeufe);
         Korrekte_Eingabe := True;
      exception -- Ausnahmebehandlung, wenn keine Zahl eingegeben wurde
         when Text_IO.Data_Error =>
            Korrekte_Eingabe := False;
            Text_IO.Skip_Line; -- falsche Eingabe weglesen
            Text_IO.Put_Line ("Sie haben keine Zahl eingegeben!");
      end;
      exit when Korrekte_Eingabe and then Durchlaeufe in 1..10;
      if Korrekte_Eingabe then
         Text_IO.Put ("Das ist keine Zahl zwischen 1 und 10.");
      else
         Text_IO.Put ("Sie haben keine Zahl eingegeben.");
      end if;
      Text_IO.New_Line;
      Text_IO.Put_Line ("Bitte noch einmal versuchen.");
   end loop;

   for I in 1..Durchlaeufe loop
      Text_IO.New_Line;
      Text_IO.Put("Geben Sie bitte den Dividenden und den Divisor ein.");
      Text_IO.New_Line;
      loop
         begin
            Int_IO.Get (Dividend);
            Int_IO.Get (Divisor);
            Korrekte_Eingabe := True;
         exception -- Ausnahmebehandlung, wenn keine Zahl Zahl eingegeben wurde
            when Text_IO.Data_Error =>
                Korrekte_Eingabe := False;
                Text_IO.Skip_Line; -- falsche Eingabe weglesen
                Text_IO.New_Line;
                Text_IO.Put_Line ("Bitte noch einmal versuchen.");
         end;
         exit when Korrekte_Eingabe;
      end loop;
      begin
         Text_IO.Put ("Der Quotient ist: ");
         Int_IO.Put (Dividend / Divisor);
         Text_IO.Put (" und der Rest ist: ");
         Int_IO.Put ( Dividend rem Divisor );
         Text_IO.Put_Line (".");
      exception -- Ausnahmebehandlung, wenn als Divisor "0" eingegeben wurde
         when Constraint_Error =>
            Text_IO.New_Line;
            Text_IO.Put_Line ("Achtung, der Divisor ist Null.- " & " Kein Ergebnis lieferbar.");
      end;
   end loop;
end Div3;

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.

I : Integer := 0;
P : Positive := I;

Ü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.


 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.