Teilen über


try-finally-Anweisung (C)

Microsoft-spezifisch

Die try-finally Anweisung ist eine Microsoft-Erweiterung auf die C-Sprache, mit der Anwendungen die Ausführung von Bereinigungscode garantieren können, wenn die Ausführung eines Codesblocks unterbrochen wird. Die Bereinigung besteht aus Aufgaben wie der Zuordnung von Speicher, dem Schließen von Dateien und dem Freigeben von Dateihandles. Die try-finally Anweisung ist besonders nützlich für Routinen mit mehreren Stellen, an denen eine Überprüfung auf einen Fehler durchgeführt wird, der eine vorzeitige Rückgabe aus der Routine verursachen könnte.

try-finally-statement:
__try compound-statement __finally compound-statement

Die zusammengesetzte Anweisung nach der __try Klausel ist der geschützte Abschnitt. Die zusammengesetzte Anweisung nach der __finally Klausel ist der Beendigungshandler. Der Handler gibt eine Reihe von Aktionen an, die beim Beenden des geschützten Abschnitts ausgeführt werden. Es spielt keine Rolle, ob der geschützte Abschnitt durch eine Ausnahme (abnormale Beendigung) beendet wird oder standardmäßig durchfallen (normale Beendigung).

Control erreicht eine Anweisung durch einfache __try sequenzielle Ausführung (Fall through). Wenn das Steuerelement die __try Anweisung eingibt, wird der zugehörige Handler aktiv. Die Ausführung wird wie folgt fortgesetzt:

  1. Der geschützte Abschnitt wird ausgeführt.

  2. Der Beendigungshandler wird aufgerufen.

  3. Nach Abschluss des Beendigungshandlers wird die Ausführung nach der __finally Anweisung fortgesetzt. Unabhängig davon, wie der geschützte Abschnitt endet (z. B. über eine goto Anweisung aus dem geschützten Text oder über eine return Anweisung), wird der Beendigungshandler ausgeführt, bevor der Kontrollfluss aus dem geschützten Abschnitt verschoben wird.

Das __leave Schlüsselwort ist innerhalb eines Anweisungsblocks try-finally gültig. Der Effekt __leave besteht darin, zum Ende des try-finally Blocks zu springen. Der Beendigungshandler wird sofort ausgeführt. Obwohl eine goto Anweisung verwendet werden kann, um dasselbe Ergebnis zu erzielen, führt eine goto Anweisung dazu, dass der Stapel sich abhebt. Die __leave Aussage ist effizienter, da sie keine Stapelauskopplung erfordert.

Das Beenden einer Anweisung mithilfe einer try-finallyreturn Anweisung oder der longjmp Laufzeitfunktion gilt als abnorme Beendigung. Es ist nicht legal, in eine __try Aussage zu springen, sondern legal, um aus einer zu springen. Alle __finally Anweisungen, die zwischen dem Ausgangspunkt und dem Ziel aktiv sind, müssen ausgeführt werden. Es wird als lokales Entspannen bezeichnet.

Der Beendigungshandler wird nicht aufgerufen, wenn ein Prozess beim Ausführen einer try-finally Anweisung beendet wird.

Hinweis

Die strukturierte Ausnahmebehandlung funktioniert mit C- und C++-Quelldateien. Es wurde jedoch nicht speziell für C++ entwickelt. Bei tragbaren C++-Programmen sollte die C++-Ausnahmebehandlung anstelle der strukturierten Ausnahmebehandlung verwendet werden. Außerdem ist der C++-Ausnahmebehandlungsmechanismus viel flexibler, da er Ausnahmen eines beliebigen Typs verarbeiten kann. Weitere Informationen finden Sie unter Ausnahmebehandlung in der C++-Sprachreferenz.

Sehen Sie sich das Beispiel für die try-except Anweisung an, um zu sehen, wie die try-finally Anweisung funktioniert.

Microsoft-spezifisch beenden

Siehe auch

try-finally -Anweisung (C++)