Freigeben über


/EH (Ausnahmebehandlungsmodell)

Gibt die Art 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 sowohl asynchrone strukturierte Ausnahmen als auch C++-Ausnahmen ab; C++-Objekte, die aufgrund einer asynchronen Ausnahme außerhalb des Gültigkeitsbereichs liegen, werden jedoch nicht beschädigt.

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

Argumente

  • a
    Das Ausnahmebehandlungsmodell, mit dem sowohl asynchrone (strukturierte) als auch synchrone (C++) Ausnahmen abgefangen werden.

  • s
    Das Ausnahmebehandlungsmodell, das nur C++-Ausnahmen abfängt und den Compiler anweist anzunehmen, dass Funktionen, die als extern "C"-Funktionen deklariert sind, eine C++-Ausnahme auslösen können.

  • c
    Bei Verwendung mit s (/EHsc) werden nur C++-Ausnahmen erfasst, und der Compiler wird angewiesen anzunehmen, dass Funktionen, die als extern "C"-Funktionen deklariert sind, nie eine C++-Ausnahme auslösen.

    /EHca entspricht /EHa.

Hinweise

Die Compileroption /EHa unterstützt die asynchrone strukturierte Ausnahmebehandlung (Structured Exception Handling, SEH) mit der systemeigenen C++-Klausel catch(...). Sie können zur Implementierung von SEH ohne Angabe von /EHa die Syntax __try, __except und __finally verwenden. SEH wird zwar von Windows und Visual C++ unterstützt, trotzdem ist die Verwendung der ISO-Standard-C++-Ausnahmebehandlung (/EHs oder /EHsc) empfehlenswert, da Code damit besser portierbar und flexibler ist. Dennoch kann es erforderlich sein, SEH in vorhandenem Code oder für bestimmte Arten von Programmen zu verwenden, z. B. in Code, der zur Unterstützung der Common Language Runtime (/clr (Common Language Runtime-Kompilierung)) kompiliert wird. Weitere Informationen finden Sie unter Strukturierte Ausnahmebehandlung (C/C++).

Die Angabe von /EHa und der Versuch, alle Ausnahmen mit catch(...) zu behandeln, kann riskant sein. Da asynchrone Ausnahmen größtenteils nicht behebbar sind, gelten sie als schwerwiegende Ausnahmen. Wenn Sie sie abfangen und den Prozess anschließend fortsetzen, können Beschädigungen und Fehler auftreten, die schwer zu finden und zu beheben sind.

Wenn Sie /EHs oder /EHsc verwenden, werden durch die catch(...)-Klausel keine asynchronen strukturierten Ausnahmen abgefangen. Zugriffverletzungen und verwaltete Exception-Ausnahmen werden nicht abgefangen, und beim Erzeugen von asynchronen Ausnahmen werden Objekte im Gültigkeitsbereich nicht beschädigt, auch dann nicht, wenn die asynchrone Ausnahme behandelt wird.

Wenn Sie /EHa verwenden, erhalten Sie möglicherweise ein größeres und weniger leistungsfähiges Image, da vom Compiler ein try-Block nicht so aggressiv optimiert wird und er Ausnahmefilter beibehält, die automatisch die Destruktoren aller lokalen Objekte aufrufen, auch dann, wenn der Compiler keinen Code feststellt, der eine C++-Ausnahme auslösen könnte. Dies ermöglicht sichere Stapelentladungen für asynchrone Ausnahmen sowie für C++-Ausnahmen. Wenn Sie /EHs verwenden, nimmt der Compiler an, dass Ausnahmen nur an einer throw-Anweisung oder einem Funktionsaufruf auftreten können. Damit kann der Compiler Code für die Lebensdauerverfolgung vieler nicht entladbarer Objekte entfernen, wodurch sich die Codegröße u. U. deutlich reduziert.

Es wird empfohlen, Objekte, die mit /EHa kompiliert wurden, im selben ausführbaren Modul nicht mit Objekten zu verknüpfen, die mit /EHs kompiliert wurden. Wenn Sie unter Verwendung von /EHa an einer beliebigen Position innerhalb des Moduls eine asynchrone Ausnahme behandeln müssen, kompilieren Sie mithilfe von /EHa den gesamten Code im Modul. Sie können die Syntax für die strukturierte Ausnahmebehandlung im selben Modul wie Code verwenden, der mit /EHs kompiliert wurde, jedoch dürfen Sie die SEH-Syntax innerhalb einer Funktion nicht mit try, throw und catch kombinieren.

Verwenden Sie /EHa, wenn Sie eine Ausnahme abfangen möchten, die nicht durch eine throw-Anweisung ausgelöst wurde. Im nachfolgenden Beispiel wird eine strukturierte Ausnahme generiert und abgefangen:

// 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 muss /EHs oder /EHa angegeben sein. Die Verwendung von /clr beinhaltet /EHa (d. h. /clr /EHa ist redundant). Vom Compiler wird ein Fehler generiert, wenn /EHs[c] nach /clr verwendet wird. Optimierungen haben auf dieses Verhalten keinen Einfluss. Wenn die Ausnahme abgefangen wird, werden vom Compiler die Klassendestruktoren für die Objekte aufgerufen, die sich in demselben Gültigkeitsbereich wie die Ausnahme befinden. Wenn eine Ausnahme nicht abgefangen wird, werden diese Destruktoren nicht ausgeführt.

Weitere Informationen über Beschränkungen für die Ausnahmebehandlung unter /clr finden Sie unter _set_se_translator.

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

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

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Ausführliche Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.

  2. Erweitern Sie im linken Bereich die Struktur Konfigurationseigenschaften, C/C++, Codegenerierung.

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

    Oder legen Sie den Wert für C++-Ausnahmen aktivieren auf Nein fest, und fügen Sie dann auf der Eigenschaftenseite Befehlszeile im Feld Zusätzliche Optionen die Compileroption hinzu.

So legen Sie diese Compileroption programmgesteuert fest

Siehe auch

Referenz

Compileroptionen

Festlegen von Compileroptionen

Ausnahmespezifikationen

Strukturierte Ausnahmebehandlung (C/C++)

Konzepte

Behandeln von Fehlern und Ausnahmen (Modern C++)