next up previous contents index
Weiter: 7 Pakete Hinauf: 6 Exceptions Zurück: Das Auslösen von

6.3 Die Behandlung von Exceptions

  

Eine vordefinierte Exception, die vom Laufzeitsystem ausgelöst worden ist, oder eine Exception, die mittels einer Raise-Anweisung ausgelöst worden ist, kann mit einem sogenannten Exception-Handler   ,,gefangen``werden. So ein Exception-Handler kann am Ende einer Block-Anweisung oder am Ende eines Unterprogrammes stehen. Eine derart gestaltete Block-Anweisung hat typischer Weise folgende Struktur

begin
<Anweisungen>
exception
when E_Bezeichner: Exception_1 Exception_2 =>
<Anweisungen>
when Exception_3 =>
<Anweisungen>
end;

Als letzte Alternative darf wieder others stehen.

Der oben angeführte E_Bezeichner ist optional und darf einmal pro When-Anweisung stehen. Er bezeichnet innerhalb der When-Anweisung die gerade behandelte Exception.

Vorgriff: Der Exception-Bezeichner kann dazu verwendet werden, geeignete Operationen mit der behandelten Exception durchzuführen. Dazu gibt es ein passendes vordefiniertes Paket namens Ada.Exceptions:

package Ada.Exceptions is
type Exception_Id is private;
Null_Id: constant Exception_Id;
function Exception_Name(Id: exception_Id) return string;

type Exception_Occurrence is limited private;
type Exception_Occcurrence_Access is access all Exception_Occurrence;
Null_Occurrence: constant Exception_Occurence;

procedure Raise_Exception(E: in Exception_Id; Message: in string := "");
function Exception_Message(X: Exception_Occurrence) return string;
procedure Reraise_Occurrence(X: in Exception_Occurrence);

function Exception_Identity(X: Exception_Occurence) return Exception_Id;
function Exception_Name(X: Exception_Occurence) return string;
function Exception_Information(X: Exception_Occurence) return string;

procedure Exception Save_Occurrence(
Target: out Exception_Occurrence;
Source: in Exception_Occurrence);
function Exception Save_Occurrence(Source: Exception_Occurrence)
return Exception_Occurrence_Access;

private
...
end Ada.Exceptions;

DER EXCEPTION-BEZEICHNER IST IN DIESEM SINN VOM TYP Exception_Occurrence.

In einem Exception-Handler wird eine dort angeführte Exception genau dann gefangen, wenn sie innerhalb des darüber befindlichen Blocks ausgelöst wird. Mit others kann man alle anderen Exceptions, auch unbekannte, fangen.

Eine Exception, die in einem Unterprogramm nicht gefangen wird, wird an der Stelle wieder ausgelöst, wo dieses Unterprogramm aufgerufen wurde, eine Execption, die innerhalb eines Blocks nicht gefangen wird, wird am Ende des Blocks wieder ausgelöst.

Man kann natürlich auch innerhalb eines Exception-Handlers eine Exception mit einer Raise-Anweisung auslösen. Will man dieselbe Exception wieder auslösen, die man gerade gefangen hat, so genügt es

raise;

   zu verwenden. Dies ist vor allem für Exception-Handler, die auf mehrere Exceptions gleich reagieren sollen, und für alle mit others gefangenen Exceptions sinnvoll. Mit dieser Art, Exception-Handler zu programmieren, kann man, insbesondere beim Auftreten von ,,unvorhergesehenen`` Fehlern, bevor die entsprechende Exception mit raise weitergereicht wird, noch ,,Clean up-Operationen``durchführen.



next up previous contents index
Weiter: 7 Pakete Hinauf: 6 Exceptions Zurück: Das Auslösen von

Johann Blieberger
Wed Feb 11 09:58:52 MET 1998