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.
Microsoft-spezifisch
Die try-except Anweisung ist eine Microsoft-Erweiterung auf die Sprache C, mit der Anwendungen die Kontrolle über ein Programm erhalten können, wenn Ereignisse auftreten, die normalerweise die Ausführung beenden. Solche Ereignisse werden als Ausnahmen bezeichnet, und der Mechanismus, der ausnahmen behandelt, wird als strukturierte Ausnahmebehandlung bezeichnet.
Ausnahmen können hardware- oder softwarebasiert sein. Auch wenn Anwendungen von Hardware- oder Softwareausnahmen nicht vollständig wiederhergestellt werden können, ermöglicht die strukturierte Ausnahmebehandlung das Protokollieren und Anzeigen von Fehlerinformationen. Es ist hilfreich, den internen Zustand der Anwendung abzufangen, um das Problem zu diagnostizieren. Insbesondere ist es hilfreich für zeitweilige Probleme, die nicht leicht zu reproduzieren sind.
Syntax
try-except-statement:
__trycompound-statement__except (expression)compound-statement
Die zusammengesetzte Anweisung nach der __try Klausel ist der geschützte Abschnitt. Die zusammengesetzte Anweisung nach der __except Klausel ist der Ausnahmehandler. Der Handler gibt eine Reihe von Aktionen an, die ausgeführt werden sollen, wenn während der Ausführung des geschützten Abschnitts eine Ausnahme ausgelöst wird. Die Ausführung wird wie folgt fortgesetzt:
Der geschützte Abschnitt wird ausgeführt.
Wenn während der Ausführung des geschützten Abschnitts keine Ausnahme auftritt, wird die Ausführung nach der Klausel an der
__exceptAnweisung fortgesetzt.Wenn eine Ausnahme während der Ausführung des geschützten Abschnitts oder in einer Routine der geschützten Abschnittsaufrufe auftritt, wird der
__exceptAusdruck ausgewertet. Der zurückgegebene Wert bestimmt, wie die Ausnahme behandelt wird. Es gibt drei mögliche Werte:EXCEPTION_CONTINUE_SEARCH: Die Ausnahme wird nicht erkannt. Suchen Sie den Stapel nach einem Handler, zuerst nach Anweisungentry-exceptund dann nach Handlern mit der nächsten höchsten Rangfolge.EXCEPTION_CONTINUE_EXECUTION: Die Ausnahme wird erkannt, aber geschlossen. Setzen Sie die Ausführung an dem Punkt fort, an dem die Ausnahme aufgetreten ist.EXCEPTION_EXECUTE_HANDLERDie Ausnahme wird erkannt. Übertragen Sie das Steuerelement an den Ausnahmehandler, indem Sie die__exceptVerbund-Anweisung ausführen, und setzen Sie dann die Ausführung an dem Punkt fort, an dem die Ausnahme aufgetreten ist.
Da der __except Ausdruck als C-Ausdruck ausgewertet wird, ist er entweder auf einen einzelnen Wert, den Operator für bedingten Ausdruck oder den Kommaoperator beschränkt. Wenn eine umfangreichere Verarbeitung erforderlich ist, kann der Ausdruck eine Routine aufrufen, die einen der drei oben aufgeführten Werte zurückgibt.
Hinweis
Die strukturierte Ausnahmebehandlung funktioniert mit C- und C++-Quelldateien. Es wurde jedoch nicht speziell für C++ entwickelt. Bei tragbaren C++-Programmen sollte die C++-Ausnahmebehandlung anstelle der strukturierten Ausnahmebehandlung verwendet werden. Außerdem ist der C++-Ausnahmebehandlungsmechanismus viel flexibler, da er Ausnahmen eines beliebigen Typs verarbeiten kann. Weitere Informationen finden Sie unter Ausnahmebehandlung in der C++-Sprachreferenz.
Jede Routine in einer Anwendung kann über einen eigenen Ausnahmehandler verfügen. Der __except Ausdruck wird im Bereich des __try Textkörpers ausgeführt. Er hat Zugriff auf alle dort deklarierten lokalen Variablen.
Das __leave Schlüsselwort ist innerhalb eines Anweisungsblocks try-except gültig. Der Effekt __leave besteht darin, zum Ende des try-except Blocks zu springen. Die Ausführung wird nach dem Ende des Ausnahmehandlers fortgesetzt. Obwohl eine goto Anweisung verwendet werden kann, um dasselbe Ergebnis zu erzielen, führt eine goto Anweisung dazu, dass der Stapel sich abhebt. Die __leave Aussage ist effizienter, da sie keine Stapelauskopplung erfordert.
Das Beenden einer try-except Anweisung mithilfe der longjmp Laufzeitfunktion gilt als abnorme Beendigung. Es ist nicht legal, in eine __try Aussage zu springen, aber es ist legal, aus einer zu springen. Der Ausnahmehandler wird nicht aufgerufen, wenn ein Prozess in der Mitte der Ausführung einer try-except Anweisung getötet wird.
Beispiel
Hier sehen Sie ein Beispiel für einen Ausnahmehandler und einen Beendigungshandler. Weitere Informationen zu Beendigungshandlern finden Sie in try-finally der Anweisung (C).
.
.
.
puts("hello");
__try {
puts("in try");
__try {
puts("in try");
RAISE_AN_EXCEPTION();
} __finally {
puts("in finally");
}
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
puts("in except");
}
puts("world");
Hier ist die Ausgabe aus dem Beispiel, wobei kommentare rechts hinzugefügt werden:
hello
in try /* fall into try */
in try /* fall into nested try */
in filter /* execute filter; returns 1 so accept */
in finally /* unwind nested finally */
in except /* transfer control to selected handler */
world /* flow out of handler */
Microsoft-spezifisch beenden