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
, catch
und 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 __try
Handler wechselt, wird der zugeordnete Handler aktiv. Wenn die Ablaufsteuerung das Ende des try-Blocks erreicht, wird die Ausführung wie folgt fortgesetzt:
Der Beendigungshandler wird aufgerufen.
Wenn der Beendigungshandler abgeschlossen ist, wird die Ausführung nach der
__finally
-Anweisung fortgesetzt. Der geschützte Abschnitt endet jedoch (z. B. über einengoto
aus dem geschützten Textkörper oder einerreturn
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.
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
, __finally
und __leave
es sei denn, Compileroption/Za
(Spracherweiterungen deaktivieren) wird _finally
angegeben. _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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für