Exception-Behandlungsanweisungen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Exception-Behandlungsroutinen erstellen

Exception-Behandlungsblöcke beginnen mit dem Schlüsselwort except und enden mit dem Schlüsselwort end. Diese beiden Schlüsselwörter sind eigentlich Teil derselben Anweisung wie der try-Block. Das heißt, in Delphi werden sowohl der try-Block als auch der Exception-Behandlungsblock als Teile einer einzigen try...except-Anweisung betrachtet.

In den Exception-Behandlungsblock können ein oder mehrere Exception-Behandlungsroutinen aufgenommen werden. Eine Exception-Behandlungsroutine ist eine Anweisung der Form

 on <Exception-Typ> do <Anweisung>;

Beispielsweise umfasst der folgende Exception-Behandlungsblock mehrere Behandlungsroutinen für verschiedene Exceptions, die durch eine arithmetische Berechnung ausgelöst werden können:

 try
 { Berechnungsanweisungen }
 except
   on EZeroDivide do Value := MAXINT;
   on EIntOverflow do Value := 0;
   on EIntUnderflow do Value := 0;
 end;

Normalerweise benötigt eine Exception-Behandlungsroutine wie im obigen Beispiel lediglich die Angabe des Typs und keine weiteren Informationen über Exceptions. Die Anweisungen nach on..do gelten also nur für den jeweiligen Exception-Typ. In bestimmten Fällen werden jedoch einige Informationen benötigt, die in der Exception-Objektinstanz enthalten sind.

Mit einer speziellen Form der on..do-Struktur erhalten Sie Zugriff auf die Exception-Instanz und können diese Informationen in einer Exception-Behandlungsroutine lesen. Diese spezielle Form setzt eine temporäre Variable voraus, in der die Instanz gespeichert werden kann. Beispiel:

 on E: EIntegerRange do
   ShowMessage(Format('Expected value between %d and %d', E.Min, E.Max));

Die temporäre Variable (E in diesem Beispiel) besitzt den Typ, der hinter dem Doppelpunkt angegeben wird (in diesem Beispiel EInterRange). Sie können den Operator as verwenden, um der Exception gegebenenfalls einen spezifischeren Typ zuzuweisen.

Warnung: Geben Sie das temporäre Exception-Objekt nicht explizit frei. Die Freigabe erfolgt automatisch bei der Behandlung der Exception. Wenn Sie das Objekt explizit freigeben, tritt bei der automatischen Freigabe des (nicht mehr vorhandenen) Objekts durch die Anwendung eine Zugriffsverletzung auf.

Sie können eine einzelne Standard-Behandlungsroutine für alle Exceptions bereitstellen, für die Sie keine speziellen Behandlungsroutinen definieren. Hierzu fügen Sie einen else-Abschnitt dem Exception-Behandlungsblock hinzu:

 try
 { Anweisungen }
 except
   on ESomething do
     { Spezifischer Code zur Exception-Behandlung };
   else
     { Code zur Standard-Exception-Behandlung };
 end;

Indem Sie eine Standard-Exception-Behandlungsroutine in einen Block einfügen, wird sichergestellt, dass dieser Block jede auftretende Exception behandelt. Alle Behandlungsroutinen des umgebenden Blocks werden also überschrieben.

Warnung:  Der Einsatz dieser unspezifischen Exception-Behandlungsroutinen ist nicht empfehlenswert. Die else-Klausel verarbeitet alle Exceptions, also auch die, zu denen keinerlei Informationen vorliegen. Grundsätzlich sollten Anwendungen nur Exceptions behandeln, deren Behandlung dem Programmierer geläufig ist. Wollen Sie nur Bereinigungsarbeiten durchführen und die Behandlung dem Quelltext überlassen, der weitere Informationen zur Exception und deren Behandlung besitzt, können Sie einen finally-Block verwenden. Ausführliche Informationen zu Beendigungsblöcken finden Sie unter finally-Blöcke erstellen.

Siehe auch