Sdílet prostřednictvím


/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ýjimku

  • c
    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

  1. Otevřete dialogové okno Stránky vlastností svého projektu.Podrobnosti naleznete v tématu Postupy: Otevření stránek vlastností projektu.

  2. V levém podokně rozbalte položku Vlastnosti konfigurace, C/C++, Generování kódu.

  3. 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

Viz také

Referenční dokumentace

Možnosti kompilátoru

Nastavení možností kompilátoru

Specifikace výjimek

Strukturované zpracování výjimek (C/C++)

Koncepty

Ošetření chyb a výjimek (moderní verze jazyka C++)