Exceptions erneut auslösen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Exception-Behandlungsroutinen erstellen

In bestimmten Fällen ist es auch bei einer lokalen Behandlung von Exceptions erforderlich, die Behandlung an den umgebenden Block weiterzugeben. Nachdem die lokale Behandlungsroutine die Behandlung beendet hat, gibt sie die Exception-Instanz frei. Die Behandlungsroutine des umgebenden Blocks kann also nicht eingreifen. Sie können jedoch verhindern, dass die Behandlungsroutine die Exception freigibt und so sicherstellen, dass auch die Behandlungsroutine des umgebenden Blocks auf die Exception reagieren kann. Hierzu verwenden Sie die Anweisung raise ohne Argumente. Dieses Vorgehen wird als erneutes Auslösen einer Exception bezeichnet. Sehen Sie sich dazu das folgende Beispiel an:



 try
 { Anweisungen }
   try
 { Spezielle Anweisungen }
   except
     on ESomething do
     begin
 { Behandlung nur der speziellen Anweisungen }
       raise; { Erneutes Auslösen der Exception }
     end;
   end;
 except
   on ESomething do ...; { Die für alle verbleibenden Fälle gewünschte Behandlung }
 end;



 try
 {
   // Anweisungen
   try
   {
     // Spezielle Anweisungen
   }
   catch (const ESomething &E)
   {
     // Nur die speziellen Anweisungen werden verarbeitet;
   }
 }
 catch (const ESomething &E)
 {
   // Die für alle verbleibenden Fälle gewünschte Behandlung
 }



Wenn Quelltext im Abschnitt { Anweisungen } eine ESomething-Exception auslöst, wird nur die Behandlungsroutine im äußeren Exception-Behandlungsblock ausgeführt. Löst jedoch der Abschnitt { Spezielle Anweisungen } eine ESomething-Exception aus, wird zunächst die Behandlung im inneren Exception-Behandlungsblock und anschließend die allgemeinere Behandlung im äußeren Exception-Behandlungsblock ausgeführt. Durch erneutes Auslösen von Exceptions können problemlos spezielle Behandlungen für Exceptions in Sonderfällen definiert werden, ohne dass die existierenden Behandlungsroutinen überschrieben oder dupliziert werden.

Soll die Behandlungsroutine eine andere Exception auslösen, kann die raise- bzw. throw-Anweisung dies in gewohnter Weise tun, so wie unter Exception auslösen beschrieben.

Siehe auch