Structured Exception Handling (C/C++)Structured Exception Handling (C/C++)

Die strukturierte Ausnahmebehandlung (SEH) ist eine Microsoft-Erweiterung von C, mit der bestimmte außergewöhnliche Code Situationen, z. b. Hardwarefehler, ordnungsgemäß behandelt werden.Structured exception handling (SEH) is a Microsoft extension to C to handle certain exceptional code situations, such as hardware faults, gracefully. Obwohl Windows und Microsoft C++ SEH unterstützen, empfehlen wir die Verwendung der ISO-Standard-C++-Ausnahmebehandlung.Although Windows and Microsoft C++ support SEH, we recommend that you use ISO-standard C++ exception handling. Dadurch wird Ihr Code portabler und flexibler.It makes your code more portable and flexible. Um vorhandenen Code oder bestimmte Arten von Programmen beizubehalten, müssen Sie jedoch möglicherweise SEH verwenden.However, to maintain existing code or for particular kinds of programs, you still might have to use SEH.

Microsoft-spezifisch:Microsoft-specific:

GrammatikGrammar

try-except-statement :try-except-statement :
__try compound-statement __except ( expression ) compound-statement__try compound-statement __except ( expression ) compound-statement

try-finally-statement :try-finally-statement :
__try compound-statement __finally compound-statement__try compound-statement __finally compound-statement

HinweiseRemarks

Mit Seh können Sie sicherstellen, dass Ressourcen, z. b. Speicherblöcke und Dateien, ordnungsgemäß freigegeben werden, wenn die Ausführung unerwartet beendet wird.With SEH, you can ensure that resources, such as memory blocks and files, get released correctly if execution unexpectedly terminates. Sie können auch bestimmte Probleme – z. b. unzureichenden Arbeitsspeicher – behandeln, indem Sie präzisen strukturierten Code verwenden, der keine- goto Anweisungen oder aufwändige Tests von Rückgabecodes verwendet.You can also handle specific problems—for example, insufficient memory—by using concise structured code that doesn't rely on goto statements or elaborate testing of return codes.

Die try-except -und- try-finally Anweisungen, auf die in diesem Artikel verwiesen wird, sind Microsoft-Erweiterungen der Programmiersprache C.The try-except and try-finally statements referred to in this article are Microsoft extensions to the C language. Sie unterstützen SEH, indem es Anwendungen ermöglicht wird, die Steuerung eines Programms nach Ereignissen abzurufen, die andernfalls das Beenden der Ausführung zur Folge haben würden.They support SEH by enabling applications to gain control of a program after events that would otherwise terminate execution. Obwohl SEH mit C++-Quelldateien funktioniert, ist sie nicht ausdrücklich für C++ vorgesehen.Although SEH works with C++ source files, it's not specifically designed for C++. Wenn Sie SEH in einem C++-Programm verwenden, das Sie mit der-Option /EHa oder /EHsc der-Option kompilieren, werden debugtoren für lokale Objekte aufgerufen, andere Ausführungs Verhalten sind jedoch möglicherweise nicht das, was Sie erwarten.If you use SEH in a C++ program that you compile by using the /EHa or /EHsc option, destructors for local objects are called but other execution behavior might not be what you expect. Eine Abbildung finden Sie im Beispiel weiter unten in diesem Artikel.For an illustration, see the example later in this article. In den meisten Fällen wird anstelle von SEH empfohlen, die ISO-Standard- C++-Ausnahmebehandlungzu verwenden, die der Microsoft C++-Compiler ebenfalls unterstützt.In most cases, instead of SEH we recommend that you use ISO-standard C++ exception handling, which the Microsoft C++ compiler also supports. Mithilfe der C++-Ausnahmebehandlung können Sie eine bessere Portierbarkeit des Codes sicherstellen, und Sie können Ausnahmen jeglichen Typs behandeln.By using C++ exception handling, you can ensure that your code is more portable, and you can handle exceptions of any type.

Wenn Sie über C-Code verfügen, der Seh verwendet, können Sie ihn mit C++-Code mischen, der die C++-Ausnahmebehandlung verwendet.If you have C code that uses SEH, you can mix it with C++ code that uses C++ exception handling. Weitere Informationen finden Sie unter behandeln strukturierter Ausnahmen in C++.For information, see Handle structured exceptions in C++.

Es gibt zwei SEH-Mechanismen:There are two SEH mechanisms:

  • Ausnahmehandleroder- __except Blöcke, die auf die Ausnahme reagieren oder diese verwerfen können.Exception handlers, or __except blocks, which can respond to or dismiss the exception.

  • Beendigungs Handleroder- __finally Blöcke, die immer aufgerufen werden, unabhängig davon, ob eine Ausnahme beendet wird oder nicht.Termination handlers, or __finally blocks, which are always called, whether an exception causes termination or not.

Diese beiden Arten von Handlern sind unterschiedlich, sind aber eng über einen Prozess verknüpft, der als entwickeln des Stapelsbezeichnet wird.These two kinds of handlers are distinct, but are closely related through a process known as unwinding the stack. Wenn eine strukturierte Ausnahme auftritt, sucht Windows nach dem zuletzt installierten Ausnahmehandler, der derzeit aktiv ist.When a structured exception occurs, Windows looks for the most recently installed exception handler that's currently active. Beim Handler kann eine von drei Möglichkeiten auftreten:The handler can do one of three things:

  • Fehler beim Erkennen der Ausnahme und Übergabe des Steuerelements an andere HandlerFail to recognize the exception and pass control to other handlers.

  • Erkennen der Ausnahme, diese aber zurückweisenRecognize the exception but dismiss it.

  • Erkennen und behandeln der AusnahmeRecognize the exception and handle it.

Der Ausnahmehandler, der die Ausnahme erkennt, befindet sich möglicherweise nicht in der Funktion, die bei Auftreten der Ausnahme ausgeführt wurde.The exception handler that recognizes the exception may not be in the function that was running when the exception occurred. Sie kann sich in einer Funktion viel höher auf dem Stapel befinden.It may be in a function much higher on the stack. Die gegenwärtig ausgeführte Funktion sowie alle weiteren Funktionen im Stapelrahmen werden beendet.The currently running function and all other functions on the stack frame are terminated. Während dieses Vorgangs wird der Stapel entwickelt.During this process, the stack is unwound. Das heißt, lokale nicht statische Variablen von beendeten Funktionen werden aus dem Stapel gelöscht.That is, local non-static variables of terminated functions get cleared from the stack.

Beim Entladen des Stapels ruft das Betriebssystem alle Beendigungshandler auf, die Sie für jede Funktion geschrieben haben.As it unwinds the stack, the operating system calls any termination handlers that you've written for each function. Mithilfe eines Beendigungs Handlers bereinigen Sie Ressourcen, die andernfalls aufgrund einer nicht ordnungsgemäßen Beendigung geöffnet bleiben würden.By using a termination handler, you clean up resources that otherwise would remain open because of an abnormal termination. Wenn Sie einen kritischen Abschnitt eingegeben haben, können Sie ihn im Beendigungs Handler beenden.If you've entered a critical section, you can exit it in the termination handler. Wenn das Programm heruntergefahren wird, können Sie andere Aufgaben für die Verwaltung durchführen, z. b. das Schließen und Entfernen von temporären Dateien.When the program is going to shut down, you can do other housekeeping tasks such as closing and removing temporary files.

Nächste SchritteNext steps

BeispielExample

Wie bereits erwähnt, werden debugtoren für lokale Objekte aufgerufen, wenn Sie SEH in einem C++-Programm verwenden und mit der- /EHa Option oder der- /EHsc Option kompilieren.As stated earlier, destructors for local objects are called if you use SEH in a C++ program and compile it by using the /EHa or /EHsc option. Das Verhalten während der Ausführung ist jedoch möglicherweise nicht das, was Sie erwarten, wenn Sie auch C++-Ausnahmen verwenden.However, the behavior during execution may not be what you expect if you're also using C++ exceptions. In diesem Beispiel werden diese Verhaltensunterschiede veranschaulicht.This example demonstrates these behavioral differences.

#include <stdio.h>
#include <Windows.h>
#include <exception>

class TestClass
{
public:
    ~TestClass()
    {
        printf("Destroying TestClass!\r\n");
    }
};

__declspec(noinline) void TestCPPEX()
{
#ifdef CPPEX
    printf("Throwing C++ exception\r\n");
    throw std::exception("");
#else
    printf("Triggering SEH exception\r\n");
    volatile int *pInt = 0x00000000;
    *pInt = 20;
#endif
}

__declspec(noinline) void TestExceptions()
{
    TestClass d;
    TestCPPEX();
}

int main()
{
    __try
    {
        TestExceptions();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        printf("Executing SEH __except block\r\n");
    }

    return 0;
}

Wenn Sie verwenden /EHsc , um diesen Code zu kompilieren, aber das lokale Test Steuerelement-Makro CPPEX nicht definiert ist, wird der TestClass Dekonstruktor nicht ausgeführt.If you use /EHsc to compile this code but the local test control macro CPPEX is undefined, the TestClass destructor doesn't run. Die Ausgabe sieht wie folgt aus:The output looks like this:

Triggering SEH exception
Executing SEH __except block

Wenn Sie verwenden, /EHsc um den Code zu kompilieren und CPPEX mithilfe von definiert wird /DCPPEX (sodass eine C++-Ausnahme ausgelöst wird), wird der debugtor ausgeführt TestClass , und die Ausgabe sieht wie folgt aus:If you use /EHsc to compile the code and CPPEX is defined by using /DCPPEX (so that a C++ exception is thrown), the TestClass destructor runs, and the output looks like this:

Throwing C++ exception
Destroying TestClass!
Executing SEH __except block

Wenn Sie verwenden, /EHa um den Code zu kompilieren, TestClass führt der debugtor aus, ob die Ausnahme mithilfe von std::throw oder mithilfe von SEH ausgelöst wurde, um die Ausnahme aufzurufenden.If you use /EHa to compile the code, the TestClass destructor executes whether the exception was thrown by using std::throw or by using SEH to trigger the exception. Das heißt, ob CPPEX definiert ist oder nicht.That is, whether CPPEX is defined or not. Die Ausgabe sieht wie folgt aus:The output looks like this:

Throwing C++ exception
Destroying TestClass!
Executing SEH __except block

Weitere Informationen finden Sie unter /EH (Ausnahme Behandlungsmodell).For more information, see /EH (Exception Handling Model).

Ende Microsoft-spezifischEND Microsoft-specific

Weitere InformationenSee also

AusnahmebehandlungException handling
SchlüsselwörterKeywords
<exception>
Fehler-und AusnahmebehandlungErrors and exception handling
Strukturierte Ausnahmebehandlung (Windows)Structured Exception Handling (Windows)