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
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:DER EXCEPTION-BEZEICHNER IST IN DIESEM SINN VOM TYP Exception_Occurrence.
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;
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;
Johann Blieberger