/EH (Model obsługi wyjątku)
Określa rodzaj obsługi wyjątku używanej przez kompilator i niszczy obiekty C++, które wykraczają poza zakres z powodu wyjątku.Jeśli opcja /EH nie jest określona, kompilator wychwytuje i asynchroniczne wyjątki strukturalne, i wyjątki języka C++, ale nie niszczy obiektów C++, które wykraczają poza zakres z powodu wyjątku asynchronicznego.
/EH{s|a}[c][-]
Argumenty
a
Model obsługi wyjątków, który wyłapuje i wyjątki asynchroniczne (strukturalne), i synchroniczne (C++).s
Model obsługi wyjątków, który wychwytuje tylko wyjątki C++ i informuje kompilator, aby założył, że funkcje zadeklarowane jako extern "C" mogą zgłosić wyjątek.c
Jeśli jest używany z s (/EHsc), wychwytuje tylko wyjątki C++ i informuje kompilator, aby założył, że funkcje zadeklarowane jako extern "C" nigdy nie zgłaszają wyjątku C++.Zapis /EHca jest równoważny zapisowi /EHa.
Uwagi
Opcja kompilatora /EHa jest używana do asynchronicznej obsługi wyjątków strukturalnych (SEH) z macierzystą klauzulą C++ catch(...).Aby zaimplementować SEH bez określania /EHa, można użyć składni __try, __except i __finally.Chociaż system Windows i Visual C++ wspierają obsługę wyjątków strukturalnych (SEH), zdecydowanie zalecamy obsługę wyjątków zgodną z normą ISO C++ (/EHs lub /EHsc), ponieważ dzięki niej kod jest bardziej przenośny i elastyczny.Niemniej jednak, w istniejącym kodzie lub dla szczególnych typów programów — na przykład, w kodzie skompilowanym z obsługą aparatu plików wykonywalnych języka wspólnego (/clr (Kompilacja środowiska uruchomieniowego języka wspólnego)) — nadal może być konieczne używanie SEH.Aby uzyskać więcej informacji, zobacz Obsługa wyjątków strukturalnych (C/C++).
Opcja /EHa i próba obsługi wszystkich wyjątków za pomocą catch(...) mogą być niebezpieczne.W większości przypadków wyjątki asynchroniczne są nie do odzyskania i powinny być uważane za krytyczne.Ich wychwytywanie i kontynuacja wykonania aplikacji może spowodować uszkodzenie procesu i prowadzić do błędów, które trudno znaleźć i naprawić.
Jeśli używasz /EHs lub /EHsc, wówczas klauzula catch(...) nie wychwytuje asynchronicznych wyjątków strukturalnych.Naruszenia zasad dostępu i zarządzane wyjątki Exception nie są wychwytywane, a obiekty znajdujące się w zakresie podczas generowania wyjątku asynchronicznego nie są niszczone, nawet jeśli wyjątek asynchroniczny jest obsługiwany.
Jeśli używasz /EHa, obraz może być większy i może nie działać równie sprawnie, ponieważ kompilator nie optymalizuje bloku try wystarczająco agresywnie i pozostawia filtry wyjątków, które automatycznie wywołują destruktory wszystkich obiektów lokalnych, nawet jeśli kompilator nie widzi żadnego kodu, który może zgłosić wyjątek języka C++.Umożliwia to bezpieczne odwracanie stosu dla wyjątków asynchronicznych oraz wyjątków C++.Gdy używasz /EHs, kompilator zakłada, że wyjątki mogą się zdarzyć tylko w instrukcji throw lub w wywołaniu funkcji.Dzięki temu kompilator eliminuje kod śledzenia okresu istnienia wielu odwracalnych obiektów, co może znacznie zmniejszyć rozmiar kodu.
Zaleca się nie łączyć obiektów skompilowanych przy użyciu /EHa z obiektami skompilowanymi przy użyciu /EHs w tym samym module pliku wykonywalnego.Jeśli trzeba obsługiwać wyjątek asynchroniczny przy użyciu /EHa gdziekolwiek w module, użyj /EHa do skompilowania całego kodu w module.Możesz użyć składni obsługi wyjątków strukturalnych w tym samym module co kod skompilowany przy użyciu /EHs, ale nie możesz mieszać składni SEH z try, throw i catch w tej samej funkcji.
Użyj /EHa, jeśli chcesz przechwytywać wyjątek, który jest wywoływany przez coś innego niż throw.Ten przykład generuje i wychwytuje wyjątek strukturalny:
// 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;
}
}
Opcja /EHc wymaga, aby określono /EHs lub /EHa.Używanie /clr pociąga za sobą /EHa (to znaczy, opcja /clr /EHa jest zbędna).Kompilator generuje błąd, jeśli opcja /EHs[c] jest używana po /clr.Optymalizacje nie wpływają na to zachowanie.Gdy zostaje przechwycony wyjątek, kompilator wywołuje destruktor klasy lub destruktory obiektu lub obiektów, które znajdują się w tym samym zakresie, co wyjątek.Gdy nie przechwycono wyjątku, te destruktory nie są uruchamiane.
Aby uzyskać informacje na temat ograniczeń obsługi wyjątków w /clr, zobacz: _set_se_translator.
Tę opcję można wyczyścić przy użyciu znaku -.Na przykład, opcja /EHsc- jest interpretowana jako /EHs /EHc- i jest równoważna z /EHs.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe projektu Strony właściwości.Szczegółowe informacje – zobacz Porady: otwieranie stron właściwości projektów.
W lewym okienku rozwiń węzeł Właściwości konfiguracji, C/C++, Generowanie kodu.
Zmodyfikuj właściwość Włącz wyjątki C++.
Lub ustaw Włącz wyjątki C++ na Nie, a następnie na stronie właściwości Wiersz polecenia w oknie Dodatkowe opcje dodaj opcję kompilatora.
Aby programowo ustawić tę opcję kompilatora
- Zobacz ExceptionHandling.
Zobacz też
Informacje
Obsługa wyjątków strukturalnych (C/C++)