next up previous
Nächste Seite: Objektbezogene Ereignisse Aufwärts: Ausnahmenbehandlungen Vorherige Seite: Charakterisierung von Ausnahmen

Objekt-orientierte Ausnahmenbehandlung

Cui und Gannon haben am Beispiel eines größeren Ada-Software-Systems und einiger empirischer Studien belegt, daß das Ebenenmodell in vielen Fällen unzureichend ist, und eine Ausnahmenbehandlung, die sich an den Objekten orientiert, der Vereinfachung dienen kann. In ihrer Spracherweiterung von Ada ermöglichen sie es, parametrisierte Ausnahmen direkt bei einem Datentyp zu definieren. Einer Variablen des entsprechenden Datentyps können dann direkt Ausnahmenbearbeiter zugeordnet werden. Folgendes Beispiel demonstriert dies:

generic

   type elem_type is private;
   tentative_size_limit: positive;

package stack_pkg is

   type stack is limited private
      #exception overflow(s: stack),
                 no_space(place: string) => put_line(place);

   procedure create(s: out stack);
   procedure push(s: in out stack; e: elem_type);
   -- ...
   procedure expand(s: in out stack; amount: in positive);

private
   -- ...
end stack_pkg

Die #exception-Klausel ermöglicht die Definition von objektbezogenen Ausnahmen. Die Ausnahme overflow wird initiiert, wenn der mit tentative_size_limit gegebene Rahmen überschritten wird, und no_space signalisiert, daß kein Speicherplatz mehr zur Verfügung steht, falls mit expand versucht worden ist, den Keller zu vergrößern.

Deklarationen könnten dann entsprechend dem folgenden Beispiel mit Ausnahmenbearbeitern versehen werden:

package int_stack is new stack_pkg(integer, 20);

s1: integer_stack.stack
       #when overflow(s: stack) => expand(s, growth_rate);
s2: integer_stack.stack
       #when overflow(s: stack) => retain(s, 90);

Hier soll s1 in bestimmten Schritten erweitert werden, wenn die bisherige Größe überschritten wird, während bei s2 alte Elemente des Kellers entfernt werden.

In Eiffel wird ein ähnliches Konzept unterstützt, wenngleich dort das Ebenenmodell Vorrang besitzt. Wenn eine Prozedur keinen Ausnahmenbearbeiter spezifiziert, so wird per Voreinstellung default_rescue aufgerufen. Die Prozedur default_rescue ist Teil der universellen Klasse ANY und kann von jeder Erweiterung überdefiniert werden. Da default_rescue bei ANY leer ist, wird die Ausnahme voreinstellungsgemäß weitergeleitet.

Im Unterschied zu der vorgestellten Ada-Erweiterung ist man in Eiffel gezwungen, jeweils eine Erweiterung der Klasse zu definieren, um default_rescue zu definieren. Zum anderen ist es nicht garantiert, daß default_rescue aufgerufen wird. Beide Ansätze verlangen eine statische Festlegung des Ausnahmenbearbeiters.


next up previous
Nächste Seite: Objektbezogene Ereignisse Aufwärts: Ausnahmenbehandlungen Vorherige Seite: Charakterisierung von Ausnahmen
Andreas Borchert 2000-12-18