/EH (Ausnahmebehandlungsmodell)
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 Verwendung mit s (/EHsc) werden nur C++-Ausnahmen erfasst, und der Compiler nimmt an, dass C-Funktionen vom Typ extern niemals 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 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.
Verwenden Sie /EHa, um das Modell für die Behandlung synchroner Ausnahmen festzulegen (C++-Ausnahmebehandlung mit Ausnahmen für die Behandlung strukturierter Ausnahmen). /EHa ergibt sich möglicherweise ein weniger leistungsfähiges Bild, da der Compiler einen try-Block nicht so aggressiv optimiert, auch wenn der Compiler keinen Auslösevorgang erkennt.
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
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Ausführliche Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.
Klicken Sie auf den Ordner C/C++.
Klicken Sie auf die Eigenschaftenseite Codegenerierung.
Ä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
Klicken Sie auf den Ordner C/C++.
Klicken Sie auf die Eigenschaftenseite Codegenerierung.
Legen Sie C++-Ausnahmen aktivieren auf Nein fest.
Klicken Sie auf die Eigenschaftenseite für die Befehlszeile.
Geben Sie die Compileroption im Feld Zusätzliche Optionen ein.
So legen Sie diese Compileroption programmgesteuert fest
- Weitere Informationen finden Sie unter ExceptionHandling.