/EH (model zpracování výjimek)
Určuje druh zpracování výjimek, který má kompilátor použít, a zničí objekty C++, které jsou v důsledku výjimky mimo obor.Pokud není zadán parametr /EH, zachytí kompilátor asynchronní strukturované výjimky i výjimky C++, ale nezničí objekty C++, které jsou mimo obor v důsledku asynchronní výjimky.
/EH{s|a}[c][-]
Argumenty
a
Model zpracování výjimek, který zachytává asynchronní (strukturované) i synchronní výjimky (C++)s
Model zpracování výjimek, který zachytává pouze výjimky C++ a dává kompilátoru pokyn, aby předpokládal, že funkce deklarované jako extern "C" mohou vyvolat výjimkuc
Pokud se používá s parametrem s (/EHsc), zachytává pouze výjimky C++ a dává kompilátoru pokyn, aby předpokládal, že funkce deklarované jako extern "C" nikdy nevyvolají výjimku C++./EHca je ekvivalentem /EHa.
Poznámky
Parametr kompilátoru /EHa umožňuje podporu zpracování asynchronních strukturovaných výjimek (SEH) s nativní klauzulí catch(...) jazyka C++.K implementaci SEH bez zadání parametru /EHa můžete použít syntaxi __try, __except a __finally.Ačkoli systém Windows i jazyk Visual C++ podporují SEH, z důvodu větší přenositelnosti a flexibility důrazně doporučujeme použít zpracování výjimek jazyka C++ podle standardu ISO (/EHs nebo /EHsc).V existujícím kódu nebo v určitých typech programů – například v kódu kompilovaném pro podporu prostředí Common Language Runtime (/clr (Common Language Runtime)) – je nicméně stále třeba použít SEH.Další informace naleznete v tématu Strukturované zpracování výjimek (C/C++).
Zadání parametru /EHa a ošetření všech výjimek pomocí klauzule catch(...) může být nebezpečné.Ve většině případů jsou asynchronní výjimky nenapravitelné a měly by se považovat za fatální.Jejich zachycení a zpracování může způsobit poškození procesu a vést k chybám, které lze jen těžko najít a opravit.
Použijete-li parametr /EHs nebo /EHsc, pak klauzule catch(...) nezachytí asynchronní strukturované výjimky.Nezachytí se narušení přístupu a spravované výjimky Exception, přičemž objekty, které jsou v oboru při generování asynchronní výjimky, nejsou zničeny, ani když je tato asynchronní výjimka ošetřena.
Při použití parametru /EHa může být bitová kopie větší a nemusí tak dobře fungovat, protože kompilátor neoptimalizuje blok try tak agresivně a ponechá filtry výjimek, které automaticky volají destruktory všech místních objektů, přestože kompilátor nezjistí žádný kód, který může vyvolat výjimku C++.To umožňuje bezpečné uvolnění zásobníku pro asynchronní výjimky a výjimky C++.Při použití parametru /EHs kompilátor předpokládá, že k výjimkám může dojít pouze u příkazu throw nebo při volání funkce.To umožňuje kompilátoru eliminovat kód pro sledování životnosti neuvolnitelných objektů, což může výrazně zmenšit velikost kódu.
Doporučujeme, abyste objekty kompilované pomocí parametru /EHa nepropojovali s objekty kompilovanými pomocí parametru /EHs do stejného spustitelného modulu.Pokud musíte kdekoli v modulu ošetřit asynchronní výjimky pomocí parametru /EHa, použijte ke komplikaci veškerého kódu v tomto modulu parametr /EHa.Ve stejném modulu můžete použít syntaxi zpracování strukturovaných výjimek jako v kódu kompilovaném pomocí parametru /EHs, nemůžete ale kombinovat syntaxi SEH s try, throw a catch ve stejné funkci.
Parametr /EHa použijte, pokud chcete zachytit výjimku, kterou vyvolá něco jiného než throw.Tento příklad vygeneruje a zachytí strukturovanou výjimku:
// 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;
}
}
Parametr /EHc vyžaduje zadání parametru /EHs nebo /EHa.Při použití parametru /clr se implicitně použije parametr /EHa (tzn., že /clr /EHa je nadbytečné).Kompilátor vygeneruje chybu, pokud se parametr /EHs[c] použije po parametru /clr.Optimalizace toto chování neovlivňují.Při zachycení výjimky vyvolá kompilátor destruktor třídy nebo destruktory objektů, které jsou ve stejném oboru jako výjimka.Pokud výjimka není zachycena, nejsou tyto destruktory spuštěny.
Informace o omezeních zpracování výjimek při použití parametru /clr naleznete v tématu _set_se_translator.
Parametr lze zrušit symbolem -.Například /EHsc- se interpretuje jako /EHs /EHc- a je ekvivalentní /EHs.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno Stránky vlastností svého projektu.Podrobnosti naleznete v tématu Postupy: Otevření stránek vlastností projektu.
V levém podokně rozbalte položku Vlastnosti konfigurace, C/C++, Generování kódu.
Změňte vlastnost Povolit výjimky jazyka C++.
Nebo nastavte vlastnost Povolit výjimky jazyka C++ na hodnotu Ne a pak na stránce vlastností Příkazový řádek přidejte do pole Další možnosti parametr kompilátoru.
Programové nastavení tohoto parametru kompilátoru
- Další informace naleznete v tématu ExceptionHandling.
Viz také
Referenční dokumentace
Nastavení možností kompilátoru
Strukturované zpracování výjimek (C/C++)