/EH (Ausnahmebehandlungsmodell)

Aktualisiert: Juli 2008

Gibt das Modell einer vom Compiler zu verwendenden Ausnahmebehandlung an und zerstört C++-Objekte, die aufgrund einer Ausnahme außerhalb des Gültigkeitsbereichs liegen. Wenn /EH nicht angegeben ist, fängt der Compiler strukturierte und C++-Ausnahmen ab, C++-Objekte, die aufgrund einer Ausnahme außerhalb des Gültigkeitsbereichs liegen, werden jedoch nicht zerstört.

/EH{s|a}[c][-]

Argumente

  • a
    Das Ausnahmebehandlungsmodell, das asynchrone (strukturierte) und synchrone (C++) Ausnahmen abfängt.

  • s
    Durch dieses Ausnahmebehandlungsmodell werden ausschließlich C++-Ausnahmen aufgefangen, und der Compiler geht davon aus, dass von extern C-Funktionen Ausnahmen ausgelöst werden.

  • c
    Bei der Verwendung mit s (/EHsc) werden ausschließlich C++-Ausnahmen abgefangen, und der Compiler geht davon aus, dass extern C-Funktionen nie eine C++-Ausnahme auslösen. /EHca entspricht /EHa.

Hinweise

Verwenden Sie /EHs, um das Modell für die Behandlung synchroner Ausnahmen festzulegen (C++-Ausnahmebehandlung ohne Ausnahmen für die Behandlung strukturierter Ausnahmen). Wenn Sie /EHs verwenden, werden durch die catch-Klausel keine asynchronen Ausnahmen aufgefangen. Darüber hinaus wird in Visual C++ 2005 beim Erzeugen der asynchronen Ausnahme kein gültiges Objekt zerstört. Dies ist auch dann der Fall, wenn die asynchrone Ausnahme behandelt wird. Unter /EHs werden von catch(...) nur C++-Ausnahmen aufgefangen. Zugriffsverletzungen und System.Exception-Ausnahmen werden nicht aufgefangen.

Mit /EHa legen Sie das Modell für die Behandlung asynchroner Ausnahmen fest (C++-Ausnahmebehandlung mit Ausnahmen für die Behandlung strukturierter Ausnahmen). Die Verwendung von /EHa kann zu einer verringerten Leistung führen, da vom Compiler try-Blöcke weniger dynamisch optimiert werden. Dies ist auch dann der Fall, wenn vom Compiler keine throw-Anweisung erkannt wird.

Verwenden Sie /EHa, wenn Sie eine Ausnahme auffangen möchten, die nicht durch eine throw-Anweisung ausgelöst wurde. Im folgenden Beispiel wird eine Ausnahme generiert:

// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;

void fail() {   // generates SE and attempts to catch it using catch(...)
   try {
      int i = 0, j = 1;
      j /= i;   // This will throw a SE (divide by zero).
      printf("%d", j); 
   }
   catch(...) {   // catch block will only be executed under /EHa
      cout<<"Caught an exception in catch(...)."<<endl;
   }
}

int main() {
   __try {
      fail(); 
   }

   // __except will only catch an exception here
   __except(EXCEPTION_EXECUTE_HANDLER) {   
   // if the exception was not caught by the catch(...) inside fail()
      cout << "An exception was caught in __except." << endl;
   }
}

Für die /EHc-Option ist die Angabe von /EHs oder /EHa erforderlich. Die Verwendung von /clr (Common Language Runtime-Kompilierung) impliziert /EHa (/clr /EHa ist redundant). Wenn /EHs[c] nach /clr verwendet wird, wird vom Compiler ein Fehler erzeugt, Optimierungen haben auf dieses Verhalten keinen Einfluss. Wenn die Ausnahme aufgefangen wird, werden vom Compiler die Klassendestuktoren für die Objekte aufgerufen, die sich in demselben Gültigkeitsbereich wie die Ausnahme befinden. Wenn eine Ausnahme nicht aufgefangen wird, werden diese Destruktoren nicht ausgeführt.

Beschränkungen für die Ausnahmebehandlung finden Sie unter _set_se_translator im Abschnitt /clr.

Die Option kann mit dem Symbol - deaktiviert werden. Z. B. wird /EHsc- als /EHs /EHc- interpretiert und entspricht /EHs.

Weitere Informationen finden Sie unter Exception Handling: Default Synchronous Exception Model.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Ausführliche Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.

  2. Klicken Sie auf den Ordner C/C++.

  3. Klicken Sie auf die Eigenschaftenseite Codegenerierung.

  4. Ändern Sie die Eigenschaft C++-Ausnahmen aktivieren.

Sie können auch folgendermaßen vorgehen:

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Klicken Sie auf den Ordner C/C++.

  2. Klicken Sie auf die Eigenschaftenseite Codegenerierung.

  3. Legen Sie C++-Ausnahmen aktivieren auf Nein fest.

  4. Klicken Sie auf die Eigenschaftenseite für die Befehlszeile.

  5. Geben Sie die Compileroption im Feld Zusätzliche Optionen ein.

So legen Sie diese Compileroption programmgesteuert fest

Siehe auch

Referenz

Compileroptionen

Festlegen von Compileroptionen

Exception Specifications

Änderungsprotokoll

Date

Versionsgeschichte

Grund

Juli 2008

Beschreibung überarbeitet, wie die /EHa-Option ein Abbild erzeugen könnte, das die Leistung verringert. Eine abschließende Anweisung im try-Block des Beispiels hinzugefügt, um eine unerwünschte Optimierung zu verhindern.

Informationsergänzung.