try-finally-Anweisung

Die try-finally Anweisung ist eine microsoftspezifische Erweiterung, die die strukturierte Ausnahmebehandlung in den Sprachen C und C++ unterstützt.

Syntax

Die folgende Syntax beschreibt die try-finally Anweisung:

    // . . .
    __try {
        // guarded code
    }
    __finally {
        // termination code
    }
    // . . .

Grammatik

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

Die try-finally Anweisung ist eine Microsoft-Erweiterung für die C- und C++-Sprachen, mit denen Zielanwendungen die Ausführung von sauber up-Code garantieren können, 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.

Verwandte Informationen und ein Codebeispiel finden Sie in try-except der Anweisung. Weitere Informationen zur strukturierten Ausnahmebehandlung im Allgemeinen finden Sie unter Strukturierte Ausnahmebehandlung. Weitere Informationen zum Behandeln von Ausnahmen in verwalteten Anwendungen mit C++/CLI finden Sie unter "Ausnahmebehandlung" unter /clr.

Hinweis

Die strukturierte Ausnahmebehandlung arbeitet mit Win32 für C- und C++-Quelldateien. Sie ist jedoch nicht speziell für C++ entwickelt. Sie können sicherstellen, dass der Code portabler ist, indem Sie die C++-Ausnahmebehandlung verwenden. Die C++-Ausnahmebehandlung ist auch flexibler, da sie Ausnahmen eines beliebigen Typs behandeln kann. Für C++-Programme wird empfohlen, den C++-Ausnahmebehandlungsmechanismus (try, catchund throw Anweisungen) zu verwenden.

Die Verbundanweisung nach der __try-Klausel ist der abgesicherte Abschnitt. Die Verbundanweisung nach der __finally-Klausel ist der Beendigungshandler. Der Handler gibt einen Satz von Aktionen an, die ausgeführt werden, wenn der geschützte Abschnitt beendet wird, ob er den geschützten Abschnitt durch eine Ausnahme (abnormale Beendigung) beendet oder standardmäßig durchfällt (normale Beendigung).

Die Steuerung erreicht eine __try-Anweisung durch einfache sequenzielle Ausführung (Fortfahren). Wenn das Steuerelement in den __tryHandler wechselt, wird der zugeordnete Handler aktiv. Wenn die Ablaufsteuerung das Ende des try-Blocks erreicht, wird die Ausführung wie folgt fortgesetzt:

  1. Der Beendigungshandler wird aufgerufen.

  2. Wenn der Beendigungshandler abgeschlossen ist, wird die Ausführung nach der __finally-Anweisung fortgesetzt. Der geschützte Abschnitt endet jedoch (z. B. über einen goto aus dem geschützten Textkörper oder einer return Anweisung), der Beendigungshandler wird ausgeführt , bevor der Kontrollfluss aus dem geschützten Abschnitt verschoben wird.

    Eine __finally Anweisung blockiert die Suche nach einem geeigneten Ausnahmehandler nicht.

Wenn eine Ausnahme im __try Block auftritt, muss das Betriebssystem einen Handler für die Ausnahme finden, oder das Programm schlägt fehl. Wenn ein Handler gefunden wird, werden alle __finally Blöcke ausgeführt und die Ausführung wird im Handler fortgesetzt.

Nehmen Sie z. B. an, eine Reihe von Funktionsaufrufen verbindet Funktion A mit Funktion D, wie in der folgenden Abbildung dargestellt. Jede Funktion verfügt über einen Beendigungshandler. Wenn eine Ausnahme in Funktion D ausgelöst und in A behandelt wird, werden die Beendigungshandler in folgender Reihenfolge aufgerufen, während das System den Stapel abwickelt: D, C, B.

Diagram of the order of termination handler execution.

Das Diagramm beginnt mit der Funktion A, die Funktion B aufruft, die Funktion C aufruft, die Funktion D. Function D löst eine Ausnahme aus. Die Beendigungshandler werden dann in dieser Reihenfolge aufgerufen: D's Beendigungshandler, dann C's, dann B's und dann A behandelt die Ausnahme.

Reihenfolge der Ausführung des Beendigungshandlers

Hinweis

Das Verhalten von try-finally unterscheidet sich von einigen anderen Sprachen, die die Verwendung von finally, z. B. C#, unterstützen. Ein einzelner __try kann entweder, aber nicht beides, von __finally und __except. Wenn beide zusammen verwendet werden sollen, muss eine äußere try-except-Anweisung die innere try-finally-Anweisung einschließen. Es gelten andere Regeln für die Angabe, wann ein einzelner Block ausgeführt wird.

Aus Kompatibilität mit früheren Versionen, , und _leave sind Synonyme für __try, __finallyund __leave es sei denn, Compileroption/Za(Spracherweiterungen deaktivieren) wird _finallyangegeben. _try

Das __leave-Schlüsselwort

Die __leave Schlüsselwort (keyword) ist nur innerhalb des geschützten Abschnitts einer try-finally Anweisung gültig, und der Effekt besteht darin, zum Ende des geschützten Abschnitts zu springen. Die Ausführung wird mit der ersten Anweisung im Beendigungshandler fortgesetzt.

Eine goto Anweisung kann auch aus dem geschützten Abschnitt herausspringen, beeinträchtigt jedoch die Leistung, da sie stapelaufwendigend aufruft. Die __leave Anweisung ist effizienter, da sie keine Stapelentspannung verursacht.

Nicht ordnungsgemäße Beendigung

Das Beenden einer try-finally Anweisung mithilfe der Longjmp-Laufzeitfunktion gilt als abnorme Beendigung. 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 Ausgangspunkt (normale Beendigung des __try Blocks) und dem Ziel (der Block, der __except die Ausnahme behandelt) aktiv sind, müssen ausgeführt werden. Dies wird als lokale Entladung bezeichnet.

Wenn ein __try Block aus irgendeinem Grund vorzeitig beendet wird, einschließlich eines Sprungs aus dem Block, führt das System den zugeordneten __finally Block als Teil des Vorgangs zum Entspannen des Stapels aus. In solchen Fällen gibt die AbnormalTermination Funktion zurück true , wenn sie innerhalb des __finally Blocks aufgerufen wird; andernfalls wird sie zurückgegeben false.

Der Beendigungshandler wird nicht aufgerufen, wenn ein Prozess in der Mitte der Ausführung einer try-finally Anweisung getötet wird.

ENDE der Microsoft-spezifischen Informationen

Siehe auch

Schreiben eines Beendigungshandlers
Structured Exception Handling (C/C++)
Schlüsselwörter
Syntax des Beendigungshandlers