9. Ausnahmen und Ausnahmebehandlung
 
zurück
9.5 Das Pragma "Suppress"


Für alle Anweisungen, Ausdrücke oder Deklarationen, die eine Ausnahme auslösen können, finden zur Laufzeit Prüfungen statt. Diese senken die Ausführungsgeschwindigkeit des Programms.

Um die Generierung von Laufzeitprüfungen zu unterdrücken, kann das Pragma "Suppress" verwendet werden, wobei angenommen wird, daß keine Laufzeitfehler mehr auftreten.

Das Pragma "Suppress" kann sowohl programmweit als auch für einzelne Teile der Applikation eingesetzt werden und wird mit einem Prüfungsnamen aufgerufen.

pragma Suppress (Prüfungsname [, [On =>] Programmelementname]); Das Pragma "Suppress" wird mit dem Namen einer Prüfung und evtl. mit den Namen der nicht zu prüfenden Datentypen, Variablen, Unterprogramme aufgerufen und unterdrückt die Generierung von Code zum Test dieser Prüfung; zum Beispiel verhindert das Pragma "Index_Check" die Prüfung eines Indizes auf Einhaltung der Bereichsgrenzen einer Reihung.

Optional kann ein Bezeichner (Programmelementname) angegeben werden, wodurch die Unterdrückung der Prüfung nur für diesen Bezeichner abgeschaltet wird. Um alle Prüfungen abzuschalten, muß das Pragma mit dem Prüfungsnamen "All_Checks" aufgerufen werden:

pragma Suppress (All_Checks);

Das Pragma "Suppress" kann in jedem Deklarationsteil und jeder Spezifikation verwendet werden. Je nach Übersetzer kann ein Pragma auch als Übersetzeroption (configuration pragma) angegeben werden.

Das Pragma "Suppress" sollte nicht dazu verwendet werden, vorhandene Laufzeitfehler zu ignorieren, da es der Implementierung des Übersetzers überlassen wird, diese Prüfung auch wirklich abzuschalten. Es wird nicht garantiert, daß nach Abschalten der Laufzeitprüfung wirklich keine Prüfung mehr stattfindet.

Ein Programm, das durch die Unterdrückung vorhandener Laufzeitfehler scheinbar problemlos funktioniert, könnte bei Verwendung eines anderen Übersetzers Probleme verursachen.


Die im Sprachstandard definierten und damit verwendbaren Prüfungsnamen lösen folgende Ausnahmen aus:
Prüfungen, bei denen die Ausnahme Constraint_Error ausgelöst wird: Access_Check Prüfung, ob Zeiger bei Zeigerdereferenzierung null ist.

Discriminant_Check Prüfung beim Zugriff auf Verbunde, ob die Diskriminante gültig ist.

Division_Check Prüfung, ob bei "/", "rem" oder "mod" der Divisor 0 ist.

Index_Check Prüfung der Grenzen beim Zugriff auf eine Reihung.

Length_Check Längenvergleich von Reihungen bei Vergleich oder Konvertierung.

Overflow_Check Prüfung, ob ein skalarer Wert innerhalb des Basisbereichs des Typs liegt.

Range_Check Prüfung, ob ein skalarer Wert innerhalb des für diesen Untertyp gültigen
Bereichs liegt.

Tag_Check Prüfung der Untertypen von erweiterbaren Typen bei Zuweisung und
Vergleich.


Prüfungen, bei denen die Ausnahme Program_Error ausgelöst wird:

Elaboration_Check Prüfung, ob ein Paketrumpf schon elaboriert wurde, wenn auf dessen Daten oder Unterprogramme zugegriffen wird.
Accessibility_Check Prüfung, ob Objekte oder Unterprogramme zur Zeit des Zugriffs über Zeiger noch existieren.

Prüfungen, bei denen die Ausnahme Storage_Error ausgelöst wird:

Storage_Check Prüft, ob neim Aufruf eines Allokators genügend Speicher zur Verfügung steht.


Beispiel mit Berücksichtigung des Pragmas "Suppress":

with Text_IO;
procedure Supprchk is
   N : Natural := 0; -- natuerlich (0 bis Integer'Last)
   P : Positive := 1; -- positiv (1 bis Integer'Last)
   I : Integer := -3; -- Negativer Wert zur Zuweisung an N und P
begin
   begin -- (a)
      Text_IO.New_Line;
      Text_IO.Put_Line ("Range_Check aktiv");
      -- => Jede illegale Zuweisung ergibt einen Fehler:
      Text_IO.Put_Line ("Natural: ");
      N := I; -- loest Constraint_Error aus
      Text_IO.Put_Line (Natural'Image (N));
      I := I - 1;
      Text_IO.Put_Line ("Positive: ");
      P := I; -- loest Constraint_Error aus
      Text_IO.Put_Line (Positive'Image (P));
      I := I - 1;
   exception -- (a)
      when Constraint_Error =>
          -- Meldung ausgeben und zum Programmblock (b) verzweigen:
          Text_IO.Put_Line ("Zuweisungsfehler !");
   end; -- (a)

   declare
      pragma Suppress (Range_Check);
   begin -- (b)
      Text_IO.New_Line;
      Text_IO.Put_Line ("Range_Check ausgeschaltet");
      -- => Illegale Zuweisungen ergeben nicht unbedingt einen Fehler:
      Text_IO.Put_Line ("Natural: ");
      N := I; -- loest Constraint_Error aus
      Text_IO.Put_Line (Natural'Image (N));
      I := I - 1;
      Text_IO.Put_Line ("Positive: ");
      P := I; -- loest Constraint_Error aus
      Text_IO.Put_Line (Positive'Image (P));
      I := I - 1;
   exception -- (b)
      when Constraint_Error =>
         -- Meldung ausgeben und zum naechsten Programmblock (c) verzweigen:
         Text_IO.Put_Line ("Zuweisungsfehler !");
   end; -- (b)

   declare
      pragma Suppress (Range_Check, On => Natural);
   begin -- (c)
      Text_IO.New_Line;
      Text_IO.Put_Line ("Range_Check nur fuer 'Natural' ausgeschaltet");
      -- => Illegale Zuweisungen an Positive ergeben einen Fehler,
      -- an Natural nicht unbedingt
      Text_IO.Put_Line ("Natural: ");
      N := I; -- loest Constraint_Error aus
      Text_IO.Put_Line (Natural'Image (N));
      I := I - 1;
      Text_IO.Put_Line ("Positive: ");
      P := I; -- loest Constraint_Error aus
      Text_IO.Put_Line (Positive'Image (P));
      I := I - 1;
   exception -- (c)
      when Constraint_Error =>
         -- Meldung ausgeben und weiter im Hauptprogramm:
         Text_IO.Put_Line ("Zuweisungsfehler !");
   end; -- (c)
   Text_IO.New_Line;
end Supprchk;



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