Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Schlüsselwörter __try und __finally werden verwendet, um einen Beendigungshandler zu erstellen. Das folgende Beispiel zeigt die Struktur eines Beendigungshandlers.
__try
{
// guarded body of code
}
__finally
{
// __finally block
}
Beispiele finden Sie unter Verwenden eines Beendigungshandlers.
Wie beim Ausnahmehandler erfordern sowohl der __try-Block als auch der __finally-Block geschweifte Klammern ({}) und die Verwendung einer Goto--Anweisung, um in einen der beiden Bausteine zu springen, nicht zulässig.
Der __try-Block enthält den geschützten Codetext, der durch den Beendigungshandler geschützt ist. Eine Funktion kann eine beliebige Anzahl von Beendigungshandlern aufweisen, und diese Blöcke für die Beendigungsbehandlung können in derselben Funktion oder in verschiedenen Funktionen geschachtelt werden.
Der __finally-Block wird immer dann ausgeführt, wenn der Steuerfluss den __try Block verlässt. Der __finally-Block wird jedoch nicht ausgeführt, wenn Sie eine der folgenden Funktionen innerhalb des __try-Blocks aufrufen: ExitProcess, ExitThread-oder abgebrochen.
Der __finally Block wird im Kontext der Funktion ausgeführt, in der sich der Beendigungshandler befindet. Dies bedeutet, dass der __finally-Block auf die lokalen Variablen dieser Funktion zugreifen kann. Die Ausführung des __finally-Blocks kann auf folgende Weise beendet werden.
- Ausführung der letzten Anweisung im Block und Fortsetzung der nächsten Anweisung
- Verwendung einer Steuerelementanweisung (zurückgeben, Umbruch, fortsetzen oder goto)
- Verwendung von longjmp- oder eines Sprungs zu einem Ausnahmehandler
Wenn die Ausführung des __try Blocks aufgrund einer Ausnahme beendet wird, die den Ausnahmebehandlungsblock eines framebasierten Ausnahmehandlers aufruft, wird der __finally-Block ausgeführt, bevor der Ausnahmebehandlungsblock ausgeführt wird. Ebenso verursacht ein Aufruf der longjmp- C-Laufzeitbibliotheksfunktion aus dem __try Block die Ausführung des __finally Blocks, bevor die Ausführung am Ziel des longjmp--Vorgangs fortgesetzt wird. Wenn __try Blockausführung aufgrund einer Steuerelementanweisung beendet wird (zurückgeben , Unterbrechung, fortsetzen oder goto), wird der __finally-Block ausgeführt.
Die funktion AbnormalTermination kann innerhalb des __finally Blocks verwendet werden, um zu bestimmen, ob der __try Block sequenziell beendet wurde , d. h., ob er die schließende Klammer (}) erreicht hat. Das Verlassen des __try Blocks aufgrund eines Aufrufs longjmp-, eines Sprungs zu einem Ausnahmehandler oder ein zurückgeben, Umbruch, fortsetzen oder zu Anweisung wechseln, wird als anormale Beendigung angesehen. Beachten Sie, dass das System beim Beenden sequenziell alle Stapelframes umgekehrt durchsucht, um festzustellen, ob beendigungshandler aufgerufen werden müssen. Dies kann zu Leistungsbeeinträchtigungen aufgrund der Ausführung von Hunderten von Anweisungen führen.
Um eine ungewöhnliche Beendigung des Beendigungshandlers zu vermeiden, sollte die Ausführung bis zum Ende des Blocks fortgesetzt werden. Sie können auch die __leave-Anweisung ausführen. Die __leave Erklärung ermöglicht eine sofortige Beendigung des __try Blocks, ohne eine ungewöhnliche Beendigung und ihre Leistungsstrafe zu verursachen. Überprüfen Sie die Compilerdokumentation, um zu ermitteln, ob die __leave-Anweisung unterstützt wird.
Wenn die Ausführung des __finally Blocks aufgrund der zurückgeben Steuerelementanweisung beendet wird, entspricht sie einer Goto- der schließenden Klammer in der eingeschlossenen Funktion. Daher wird die eingeschlossene Funktion zurückgegeben.