Termination-Handler Syntax

Die Schlüsselwörter __try und __finally werden verwendet, um einen Terminierungshandler zu erstellen. Das folgende Beispiel zeigt die Struktur eines Terminierungshandlers.

__try 
{ 
    // guarded body of code 
 
} 
__finally 
{ 
    // __finally block 
 
}

Beispiele finden Sie unter Verwenden eines Terminierungshandlers.

Wie beim Ausnahmehandler erfordern sowohl der __try-Block als auch der __finally-Block Klammern ({}), und die Verwendung einer goto-Anweisung zum Springen in einen beiden Block ist 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 Terminierungshandlern aufweisen, und diese Beendigungsbehandlungsblöcke können in derselben Funktion oder in verschiedenen Funktionen geschachtelt werden.

Der __finally-Block wird immer ausgeführt, wenn der Steuerungsfluss 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 abbruch.

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 mit einer der folgenden Methoden beendet werden.

  • Ausführung der letzten Anweisung im Block und Fortsetzung der nächsten Anweisung
  • Verwendung einer Steuerungsanweisung (return, break, continue oder goto)
  • Verwendung von longjmp oder sprung 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. In ähnlicher Weise bewirkt 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 Steuerungsanweisung (return, break, continue oder goto) beendet wird, wird der __finally-Block ausgeführt.

Die AbnormalTermination-Funktion kann innerhalb des __finally Blocks verwendet werden, um zu bestimmen, ob der __try Block sequenziell beendet wird, d. h. ob er die schließende Klammer (}) erreicht hat. Das Verlassen des __try-Blocks aufgrund eines Aufrufs von longjmp, eines Sprungs zu einem Ausnahmehandler oder einer Rückgabe-, Break-, Continue- oder Goto-Anweisung wird als abnormaler Abschluss betrachtet. Beachten Sie, dass ein Fehler beim sequenziellen Beenden dazu führt, dass das System alle Stapelframes in umgekehrter Reihenfolge durchsucht, um festzustellen, ob Beendigungshandler aufgerufen werden müssen. Dies kann zu Leistungseinbußen durch die Ausführung von Hunderten von Anweisungen führen.

Um eine abnormale 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 die sofortige Beendigung der __try-Sperre , ohne dass eine ungewöhnliche Beendigung und eine Leistungsstrafe verursacht wird. Überprüfen Sie ihre Compilerdokumentation, um festzustellen, ob die __leave-Anweisung unterstützt wird.

Wenn die Ausführung des __finally-Blocks aufgrund der Rückgabesteuerungsanweisung beendet wird, entspricht dies einem Wechsel zur schließenden Klammer in der einschließenden Funktion. Daher wird die einschließende Funktion zurückgegeben.