Freigeben über


Framebasierte Ausnahmebehandlung

Mit einem framebasierten Ausnahmehandler können Sie mit der Möglichkeit umgehen, dass eine Ausnahme in einer bestimmten Codesequenz auftreten kann. Ein framebasierter Ausnahmehandler besteht aus den folgenden Elementen.

  • Ein geschützter Codetext
  • Ein Filterausdruck
  • Ein Ausnahmehandlerblock

Framebasierte Ausnahmehandler werden in sprachspezifischer Syntax deklariert. Beispielsweise werden sie im Microsoft C/C++-Optimierungscompiler mithilfe von __try und __except implementiert. Weitere Informationen finden Sie unter Handlersyntax.

Der überwachte Codetext ist ein Satz von mindestens einer Anweisung, für die der Filterausdruck und der Ausnahmehandlerblock Ausnahmebehandlungsschutz bieten. Der überwachte Text kann ein Codeblock, eine Reihe geschachtelter Blöcke oder eine gesamte Prozedur oder Funktion sein. Mithilfe des Microsoft C/C++-Optimierungscompilers wird ein geschützter Textkörper durch Klammern ({}) eingeschlossen, die dem __try Schlüsselwort (keyword) folgen.

Der Filterausdruck eines framebasierten Ausnahmehandlers ist ein Ausdruck, der vom System ausgewertet wird, wenn eine Ausnahme innerhalb des geschützten Textkörpers auftritt. Diese Auswertung führt zu einer der folgenden Aktionen des Systems.

  • Das System beendet die Suche nach einem Ausnahmehandler, stellt den Computerstatus wieder her und setzt die Threadausführung an dem Punkt fort, an dem die Ausnahme aufgetreten ist.
  • Das System setzt die Suche nach einem Ausnahmehandler fort.
  • Das System überträgt die Steuerung an den Ausnahmehandler, und die Threadausführung wird sequenziell im Stapelframe fortgesetzt, in dem der Ausnahmehandler gefunden wird. Wenn sich der Handler nicht im Stapelrahmen befindet, in dem die Ausnahme aufgetreten ist, wird der Stapel vom System entladen, wobei der aktuelle Stapelrahmen und alle anderen Stapelframes verlassen werden, bis er zum Stapelrahmen des Ausnahmehandlers zurückkehrt. Bevor ein Ausnahmehandler ausgeführt wird, werden Beendigungshandler für alle geschützten Codetexte ausgeführt, die infolge der Übertragung der Steuerung auf den Ausnahmehandler beendet werden. Weitere Informationen zu Terminierungshandlern finden Sie unter Beendigungsbehandlung.

Der Filterausdruck kann ein einfacher Ausdruck sein oder eine Filterfunktion aufrufen, die versucht, die Ausnahme zu behandeln. Sie können die Funktionen GetExceptionCode und GetExceptionInformation innerhalb eines Filterausdrucks aufrufen, um Informationen zur zu filternden Ausnahme abzurufen. GetExceptionCode gibt einen Code zurück, der den Ausnahmetyp identifiziert, und GetExceptionInformation gibt einen Zeiger auf eine EXCEPTION_POINTERS Struktur zurück, die Zeiger auf CONTEXT und EXCEPTION_RECORD Strukturen enthält.

Diese Funktionen können nicht innerhalb einer Filterfunktion aufgerufen werden, aber ihre Rückgabewerte können als Parameter an eine Filterfunktion übergeben werden. GetExceptionCode kann innerhalb des Ausnahmehandlerblocks verwendet werden. GetExceptionInformation kann jedoch nicht verwendet werden, da sich die Informationen, auf die es verweist, in der Regel auf dem Stapel befinden und zerstört werden, wenn das Steuerelement an einen Ausnahmehandler übertragen wird. Eine Anwendung kann die Informationen jedoch in einen sicheren Speicher kopieren, um sie dem Ausnahmehandler zur Verfügung zu stellen.

Der Vorteil einer Filterfunktion besteht darin, dass sie eine Ausnahme behandeln und einen Wert zurückgeben kann, der bewirkt, dass das System die Ausführung ab dem Zeitpunkt fortgesetzt, an dem die Ausnahme aufgetreten ist. Bei einem Ausnahmehandlerblock wird die Ausführung dagegen sequenziell vom Ausnahmehandler statt vom Punkt der Ausnahme aus fortgesetzt.

Die Behandlung einer Ausnahme kann so einfach sein, wie das Notieren eines Fehlers und das Festlegen eines Flags, das später überprüft wird, das Drucken einer Warnung oder Fehlermeldung oder das Ausführen einer anderen eingeschränkten Aktion. Wenn die Ausführung fortgesetzt werden kann, kann es auch erforderlich sein, den Computerstatus durch Ändern des Kontextdatensatzes zu ändern. Ein Beispiel für eine Filterfunktion, die eine Seitenfehler-Ausnahme behandelt, finden Sie unter Verwenden der Funktionen des virtuellen Speichers.

Die UnhandledExceptionFilter-Funktion kann als Filterfunktion in einem Filterausdruck verwendet werden. Es wird EXCEPTION_EXECUTE_HANDLER zurückgegeben, es sei denn, der Prozess wird debuggen. In diesem Fall wird EXCEPTION_CONTINUE_SEARCH zurückgegeben.