Freigeben über


TRY--abschließendanweisung

Microsoft-spezifisch

Die folgende Syntax beschreibt die try-finally-Anweisung:

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

Grammatik

  • try-finally Anweisung:
    __tryVerbundanweisung

    __finallyVerbundanweisung

Die try-finally-Anweisung ist eine Microsoft-Erweiterung zu den Programmiersprachen C und C++, die Ziel-Anwendungen ermöglicht, die Ausführung des Bereinigungscodes zu gewährleisten, wenn die Ausführung eines Codeblocks unterbrochen wird.Bereinigen besteht aus einem solchen Aufgaben, z. B. Arbeitsspeicher Schließen von Dateien und Freigeben von Freigeben von Dateihandles.Die try-finally-Anweisung ist besonders nützlich für Routinen, die einige Stellen haben, in denen eine Überprüfung einen Fehler durchgeführt wird, die vorzeitige Rückgabe von der Routine verursachen könnte.

Weitere Informationen und ein Codebeispiel finden Sie unter TRY-ausgenommen Anweisung.Weitere Informationen über die strukturierte Ausnahmebehandlung im Allgemeinen finden Sie unter Strukturierte Ausnahmebehandlung.Weitere Informationen über die Behandlung von Ausnahmen in verwalteten Anwendungen finden Sie unter Ausnahmebehandlung unter /clr (nur auf Englisch verfügbar).

HinweisHinweis

Strukturierte Ausnahmebehandlung arbeitet mit Win32 für C- und C++-Quelldateien.Es ist daher nicht speziell für C++ entwickelt.Sie können sicherstellen, dass der Code portabler ist, indem Sie die C++-Ausnahmebehandlung verwenden.Auch die C++-Ausnahmebehandlung ist, flexibler, dass sie Ausnahmen eines beliebigen Typs behandeln kann.Für C++-Programme wird empfohlen, dass Sie den Mechanismus zur C++-Ausnahmebehandlungs (Versuchen Sie, Wurf und catch-Anweisungen).

Die Verbundanweisung nach der __try-Klausel ist der abgesicherte Abschnitt.Die Verbundanweisung nach der __finally Beendigungshandler der Klausel ist.Der Handler gibt einen Satz von Aktionen an, die ausgeführt werden, wenn der abgesicherte Abschnitt beendet wird, unabhängig davon, ob der abgesicherte Abschnitt durch eine Ausnahme (nicht ordnungsgemäße Beendigung) beendet wird oder bis zum standardmäßigen fortfahren (normale Beendigung).

Steuerelements erreicht eine __try-Anweisung durch einfache sequenzielle Ausführung (Fortfahren).Wenn die Steuerung __tryeingibt, wird der zugehörige Handler aktiv.Wenn der Ablaufsteuerung das Ende des try-Blocks erreicht wird, wird die Ausführung fortgesetzt, wie folgt:

  1. Der Beendigungshandler wird aufgerufen.

  2. Wenn der Beendigungshandler abgeschlossen wird, wird die Ausführung bei der Anweisung fortgesetzt __finally .Unabhängig davon, wie der abgesicherte Abschnitt endet (z. B. über goto im abgesicherten Text oder einer return-Anweisung out), wird der Beendigungshandler führen Sie before , das der Ablaufsteuerung im abgesicherten Abschnitt heraus bewegt wird.

    Eine __finally Anweisung sperrt keine Suchvorgänge für einen geeigneten Ausnahmehandlern.

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

Nehmen Sie z. B. eine Reihe von Funktionsaufruf Funktion auf, um ein Link D, wie in der folgenden Abbildung dargestellt.Jede Funktion verfügt über einen Beendigungshandler.Wenn eine Ausnahme in Funktion D ausgelöst und behandelt werden in A den Beendigungshandler in dieser Reihenfolge aufgerufen, während das System den Stapel entlädt: D., B, C

Reihenfolge der Beendigungshandler-Ausführung

Beenden in Handlerausführungsreihenfolge

HinweisHinweis

Das Verhalten ist try-finally zu einigen anderen Sprachen, die die Verwendung von finallyunterstützen, z. B. C# unterscheidet.Einzelnes __try hat möglicherweise einige, jedoch nicht beides, __finally und __except.Wenn beide zusammen verwendet werden soll, muss ein äußerer TRY-ausgenommen Anweisung die innere TRY--abschließend Anweisung einschließen.Die Regeln, der angibt, ob die einzelnen Block stehen auch anders ausgeführt wird.

Das Schlüsselwort __leave

Das __leave-Schlüsselwort ist nur im abgesicherten - Abschnitts einer try-finally-Anweisung gültig, und der Effekt ist, als abgesicherter an das Ende des Abschnitts zu wechseln.Die Ausführung wird mit der ersten Anweisung im Beendigungshandler fort.

Eine goto-Anweisung kann auch im abgesicherten Abschnitt herausspringen, jedoch beeinträchtigt die Leistung, da sie Stapelentladung aufruft.Die __leave-Anweisung ist effizienter, da sie nicht Stapelentladung verursacht.

Bei nicht ordnungsgemäße Beendigung

Eine try-finally-Anweisung unter Verwendung der longjmp Beenden Laufzeitfunktion, wird als nicht ordnungsgemäße Beendigung.Es ist nicht zulässig, in __try eine Anweisung zu springen, sondern aus einer herauszuspringen gültig.Alle __finally-Anweisungen, die zwischen dem Anfangspunkt (normale Beendigung des __try-Blocks) aktiv sind und das Ziel ( __except der Block, der die Ausnahme behandelt), ausgeführt werden müssen.Dies ist eine lokale Entladung aufgerufen.

Wenn ein try-Block vorzeitig aus irgendeinem Grund, einschließlich eines Herausspringung des Blocks ausgeführt wird, den das System den zugeordneten finally-Block im Rahmen des Prozesses des Entladens des Stapels beendet wird.In solchen Fällen gibt die Funktion AbnormalTermination TRUE zurück, wenn sie im finally-Block aufgerufen wird. Andernfalls wird FALSE zurückgegeben.

Der Beendigungshandler wird nicht aufgerufen, wenn ein Prozess noch das Ausführen einer try-finally-Anweisung abgebrochen wird.

Microsoft ENDES bestimmten

Siehe auch

Referenz

Schreiben eines Beendigungshandlers

Strukturierte Ausnahmebehandlung (C++)

C++-Schlüsselwörter

Termination-Handler Syntax