Einen finally-Block erstellen (Delphi)
Nach oben zu Exceptions - Index
Finally-Blöcke werden durch das Schlüsselwort finally eingeleitet. Sie sind Teil einer try...finally-Anweisung, die folgende Form hat:
try { Anweisungen, die eine Exception auslösen } finally { Anweisungen, die auch dann ausgeführt werden, wenn im try-Block eine Exception auftritt end;
Die Anwendung führt bei einer try...finally-Anweisung stets die im finally-Abschnitt enthaltenen Anweisungen aus, auch wenn im try-Block eine Exception ausgelöst wird. Löst eine Anweisung oder Routine im try-Block (oder eine Routine, die von dem im try-Block enthaltenen Code aufgerufen wird) eine Exception aus, wird die Ausführung an diesem Punkt unterbrochen. Sobald eine Exception-Behandlungsroutine gefunden wird, setzt die Anwendung die Ausführung im finally-Abschnitt fort. Dieser Abschnitt wird auch als Bereinigungs--Code bezeichnet. Nachdem der finally-Abschnitt verarbeitet wurde, wird die Exception- Behandlungsroutine aufgerufen. Tritt keine Exception auf, wird der Bereinigungs--Code in der angegebenen Reihenfolge ausgeführt, also nach den Anweisungen im try-Block.
Das folgende Codefragment zeigt eine Ereignisbehandlungsroutine, die mithilfe eines finally-Blocks sicherstellt, dass der zugewiesene Speicher auch dann freigegeben wird, wenn ein Fehler generiert wird:
procedure TForm1.Button1Click(Sender: TObject); var APointer: Pointer; AnInteger, ADividend: Integer; begin ADividend := 0; GetMem(APointer, 1024); { 1 KB Speicher wird zugewiesen } try AnInteger := 10 div ADividend; { Löst eine Exception aus } finally FreeMem(APointer, 1024); { Ausführung wird trotz Fehler an dieser Stelle fortgesetzt } end; end;
Die Anweisungen im finally-Block sind nicht vom Auftreten einer Exception abhängig. Auch wenn keine der Anweisungen im try-Abschnitt eine Exception auslöst, wird der finally-Block ausgeführt.