try-finally-Anweisung (C)
Microsoft-spezifisch
Die try-finally
-Anweisung ist eine Microsoft-Erweiterung zur Programmiersprache C, die es Zielanwendungen ermöglicht, den Bereinigungscode auszuführen, auch wenn die Ausführung eines Codeblocks unterbrochen wird. Die Bereinigung besteht aus Aufgaben wie z. B. Neuzuweisung von Arbeitsspeicher, Schließen von Dateien und Freigeben von Dateihandles. Die try-finally
-Anweisung ist besonders nützlich für Routinen, in denen an mehreren Stellen eine Fehlerüberprüfung durchgeführt wird, die eine vorzeitige Rückgabe von der Routine verursachen könnte.
try-finally-statement
:
__try
compound-statement
__finally
compound-statement
Die Verbundanweisung nach der __try
-Klausel ist der abgesicherte Abschnitt. Die Verbundanweisung nach der __finally
-Klausel ist der Beendigungshandler. Der Handler gibt eine Reihe von Aktionen an, die bei Beendigung des geschützten Abschnitts ausgeführt werden. Es spielt keine Rolle, ob der geschützte Abschnitt durch eine Ausnahme (nicht ordnungsgemäße Beendigung) oder durch standardmäßiges Fortfahren (normale Beendigung) beendet wird.
Die Steuerung erreicht eine __try
-Anweisung durch einfache sequenzielle Ausführung (Fortfahren). Wenn die Steuerung zur __try
-Anweisung wechselt, wird der zugehörige Handler aktiv. Die Ausführung erfolgt folgendermaßen:
Der geschützte Bereich wird ausgeführt.
Der Beendigungshandler wird aufgerufen.
Wenn der Beendigungshandler abgeschlossen ist, wird die Ausführung nach der
__finally
-Anweisung fortgesetzt. Unabhängig davon, wie der geschützte Abschnitt beendet wird (z. B. durch einegoto
-Anweisung zum Verlassen des geschützten Teils oder durch einereturn
-Anweisung), wird der Beendigungshandler ausgeführt, bevor die Ablaufsteuerung den geschützten Abschnitt verlässt.
Das __leave
-Schlüsselwort ist innerhalb eines try-finally
-Anweisungsblocks gültig. Die Wirkung von __leave
besteht darin, zum Ende des try-finally
-Blocks zu springen. Der Beendigungshandler wird sofort ausgeführt. Obwohl das gleiche Ergebnis mit einer goto
-Anweisung erreicht werden kann, verursacht eine goto
-Anweisung eine Stapelentladung. Die __leave
-Anweisung ist effizienter, weil sie keine Stapelentladung verursacht.
Eine try-finally
-Anweisung mithilfe einer return
-Anweisung oder der longjmp
-Laufzeitfunktion zu beenden, wird als nicht ordnungsgemäße Beendigung angesehen. Es ist nicht zulässig, in eine __try
-Anweisung zu springen, wohingegen das Herausspringen aus einer solchen zulässig ist. Alle __finally
-Anweisungen, die zwischen dem Anfangspunkt und dem Ziel aktiv sind, müssen ausgeführt werden. Dies wird als lokale Entladung bezeichnet.
Der Beendigungshandler wird nicht aufgerufen, wenn ein Prozess während der Ausführung einer try-finally
-Anweisung beendet wird.
Hinweis
Die strukturierte Ausnahmebehandlung arbeitet mit C- und C++-Quelldateien. Sie wurde jedoch nicht speziell für C++ entwickelt. Für portierbare C++-Programme sollte die C++-Ausnahmebehandlung anstelle der strukturierten Ausnahmebehandlung verwendet werden. Der C++-Ausnahmebehandlungsmechanismus ist außerdem viel flexibler, da er Ausnahmen eines beliebigen Typs behandeln kann. Weitere Informationen finden Sie unter Ausnahmebehandlung in der C++-Sprachreferenz.
Informationen zur Funktionsweise der try-finally
-Anweisung finden Sie im Beispiel für die try-except
-Anweisung.
ENDE der Microsoft-spezifischen Informationen