9. Ausnahmen und Ausnahmebehandlung
 
zurück
9.4 Das Paket Ada.Exceptions


Das Paket "Ada.Exceptions" enthält zusätzliche Funktionalität für den Umgang mit Ausnahmen. Die Erweiterungen sind besonders während des Debuggings von Nutzen.

Wenn man in einem Ada-Programm eine Fehlersuche unter Benutzung des bisher vorgestellten Ausnahmemechanismus durchführt, dann müßte für jede einzelne Ausnahme z. B. eine "Put_Line"-Anweisung geschrieben werden, um die Ausnahme kenntlich zu machen. Dieses Verfahren ist sehr umständlich.

Ada 95 vereinfacht die Ausgabe von Zusatzinformationen durch die Möglichkeit, einer Ausnahme eine Nachricht mitzugeben. Diese Nachrichten und weitere Informationen zur Fehlerlokalisierung können dann in den Ausnahmebehandler ausgegeben werden.re Informationen zur Fehlerlokalisierung können dann im Ausnahmebehandler ausgegeben werden.

Um die Auswertung der Zusatzinformationen zu ermöglichen, wird im Ausnahmebehandler ein neuer Auswahlparameter eingeführt.


Beispiel:

with Text_IO;
with Ada.Exceptions;

procedure Test is
begin
   -- ...
exception
   when Fehler_Parameter : others =>
      Text_IO.Put_Line ("Fehlerbehandlung:");
      Text_IO.Put_Line (Ada.Exceptions.Exception_Name (Fehler_Parameter));
      Text_IO.Put_Line (Ada.Exceptions.Exception_Message (Fehler_Parameter));
      Text_IO.Put_Line (Ada.Exceptions.Exception_Information (Fehler_Parameter));
end;

Die Variable "Fehler_Parameter" ist vom Typ "Exception_Occurrence". Sie wird verwendet, um Informationen über Ausnahmen zu erhalten. Diese Variable ist nur für diesen Ausnahmebehandler deklariert. Wenn mehrere Ausnahmebehandler für unterschiedliche Arten von Laufzeitfehlern hintereinander stehen, müssen hierfür unterschiedliche Variablennamen gewählt werden.

Der Ada-95-Sprachstandard definiert die drei Funktionen
"Exception_Name", "Exception_Message" und "Exception_Information", die zur Ausgabe von Informationen über Ausnahmen vorgesehen sind. Diesen Funktionen wird als Parameter jeweils die vorher zugewiesene Variable übergeben.

"Exception_Name "
gibt den vollständigen Namen der Ausnahme in Großbuchstaben aus (inkl. Paketname).

Beispiel:

Anweisung: Put_Line (Exception_Name (Data_Error'Identity));

erzeugt Ausgabe: "ADA.IO_EXCEPTIONS.DATA_ERROR"


"Exception_Message"
gibt die Nachricht aus, die bei der manuellen Erzeugung von Ausnahmen ("Raise_Exception") hinzugefügt wurde.


"Exception_Information"
liefert weitergehende Informationen über eine Ausnahme, wie z. B. die genaue Fehlerstelle im Quelltext und den Rückgabeweg von der Fehlerstelle über mehrere Unterprogramme bis zur Ausnahmebehandlung. "Exception_Information" ist übersetzerspezifisch und muß nicht implementiert sein.


Zwei zusätzliche Typen stehen bei der Verwendung des Pakets Ada.Exceptions zur Verfügung, die in Verbindung mit Ausnahmen benutzt werden: "Exception_Id" und "Exception_Occurrence". Die im Ausnahmebehandler auftretenden Objekte sind vom Typ "Exception_Occurrence". Sie enthalten Informationen über die jeweilige Ausnahmesituation, die mit verschiedenen Funktionen abgefragt werden kann. Falls nur der Name einer Ausnahme abgefragt werden soll, genügen Objekte vom Typ "Exception_Id".

Im Paket Ada.Exceptions sind Prozeduren zur Behandlung von Ausnahmen definiert, die zum Auslösen, Weiterreichen und Speichern von Ausnahmen geeignet sind:

"Raise_Exception" löst eine Ausnahme aus und hat als Parameter eine Ausnahmeidentität und eine Nachricht, die optional ist.

Ada.Exceptions.Raise_Exception (Zahl_ist_Null'Identity, "Sie haben eine Null eingegeben!");

Diese Nachricht kann dann vom Ausnahmebehandler mit "Exception_Message" abgefragt werden. Die zum Aufruf dieser Prozedur benötigte Ausnahmeidentität einer beliebigen Ausnahme wird mittels des Attributs 'Identity bestimmt.

"Reraise_Occurrence" löst eine Ausnahme erneut aus. Der einzige Parameter ist vom Typ "Exception_Occurrence" und kann somit die aktuelle oder eine gespeicherte Ausnahme erneut auslösen.

Im Gegensatz zur "raise"-Anweisung wird bei "Reraise_Occurrence" die Nachricht der Ausnahme mitübergeben, ist also zur Weitergabe von Ausnahmen gedacht, die mittels "Raise_Exception" generiert wurden.

Ada.Exceptions.Raise_Exception (Zahl_ist_null'Identity, "Sie haben eine Null eingegeben!");
...
exception
   when Fehler : Zahl_ist_null =>
      Ada.Exceptions.Reraise_Occurrence (Fehler);

"Save_Occurence" Objekte des Typs "Exception_Occurrence" können mit "Save_Occurrence" gespeichert werden.

Diese können dann an geeigneter Stelle mit "Reraise_Occurrence" erneut aufgerufen oder aber zur späteren Behandlung aufbewahrt werden.

Beispiel:

with Text_IO; with Ada.Exceptions;
procedure Zahlen is
   -- drei Moegliche Ausnahmen
   Runde_Zahl : Exception;
   Zahl_Null : Exception;
   Gerade_Zahl : Exception;

   function Lese_Zahl return Integer is
      package Int_IO is new Text_IO.Integer_IO(Integer);
      Z : Integer := 0;
   begin
      Text_IO.Put_Line ("Geben Sie eine ganze ungerade Zahl ein " & " (einen Buchstaben zum Beenden):");
      Int_IO.Get (Z);
      if Z = 0 then
         Ada.Exceptions.Raise_Exception (Zahl_Null'Identity, "Sie haben eine Null eingegeben!");
      end if;
      if Z rem 10 = 0 then
         Ada.Exceptions.Raise_Exception (Runde_Zahl'Identity, "Sie haben eine runde Zahl ( " &
                                                                 Integer'Image (Z) & " ) eingegeben!");
      end if;
      if Z rem 2 = 0 then
         Ada.Exceptions.Raise_Exception (Gerade_Zahl'Identity, "Sie haben eine gerade Zahl ( " &
                                                                 Integer'Image (Z) & " ) eingegeben!");
      end if;
      return (Z);
   end;

   Z : Integer := 0;

begin
   loop
      begin
         Z := Lese_Zahl;
         Text_IO.Put_Line ("Ihre Eingabe war: " & Integer'Image (Z));
      exception
         when Daten_Fehler : Text_IO.Data_Error =>
             -- Bei einem Data_Error (z. B. durch Texteingabe bei erwarteter
             -- Zahleneingabe) wird das Programm beendet.
             Text_IO.Put_Line ("*** Ausnahme:");
             Text_IO.Put_Line ("*** Name: " &
             Ada.Exceptions.Exception_Name (Daten_Fehler));
             Text_IO.Put_Line (" => Programmende !");
             exit;
         when Fehler : others =>
             -- Bei jedem anderen Fehler wird der Name und eine mitgelieferte
             -- Nachricht ausgegeben.
             Text_IO.Put_Line ("*** Ausnahme:");
             Text_IO.Put_Line ("*** Name: " &
             Ada.Exceptions.Exception_Name (Fehler));
             Text_IO.Put_Line ("*** Nachricht: " &
             Ada.Exceptions.Exception_Message (Fehler));
       end;
    end loop;
end Zahlen;



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