/EH (Model zpracování výjimek)

Určuje podporu modelu zpracování výjimek vygenerovaný kompilátorem. Argumenty určují, zda se má syntaxe použít catch(...) u strukturovaných i standardních výjimek jazyka C++, zdaextern se kód "C" předpokládá na throw výjimky a zda se má optimalizovat určité noexcept kontroly.

Syntaxe

/EHa[-]
/EHs[-]
/EHc[-]
/EHr[-]

Argumenty

a
Umožňuje odvíjení standardního zásobníku C++. Při použití syntaxe zachytí strukturované (asynchronní) i standardní výjimky jazyka C++ (synchronní).catch(...) /EHa přepíše oba /EHs argumenty i /EHc argumenty.

s
Umožňuje odvíjení standardního zásobníku C++. Při použití catch(...) syntaxe zachytává pouze standardní výjimky jazyka C++. Není-li /EHc zadán také, kompilátor předpokládá, že funkce deklarované jako extern "C" mohou throw výjimku jazyka C++.

c
Při použití s /EHskompilátorem předpokládá, že funkce deklarované jako extern "C" nikdy throw výjimku jazyka C++. Nemá žádný vliv při použití s /EHa (to znamená /EHca , že je ekvivalentní /EHa). /EHc je ignorována, pokud /EHs není /EHa zadána.

r
Informuje kompilátor, aby vždy vygeneroval kontroly ukončení modulu runtime pro všechny noexcept funkce. Ve výchozím nastavení mohou být kontroly noexcept za běhu optimalizované, pokud kompilátor určuje, že funkce volá pouze nehodící funkce. Tato možnost poskytuje striktní shodu jazyka C++ za cenu dodatečného kódu. /EHr je ignorována, pokud /EHs není /EHa zadána.

-
Vymaže předchozí argument možnosti. Interpretuje se například /EHsc- jako /EHs /EHc-a je ekvivalentní ./EHs

/EH argumenty lze zadat samostatně nebo zkombinovat v libovolném pořadí. Pokud je zadáno více než jedna instance stejného argumentu, poslední přepíše všechny starší. Například /EHr- /EHc /EHs je stejný jako /EHscr-a /EHscr- /EHr má stejný účinek jako /EHscr.

Poznámky

Výchozí chování zpracování výjimek

Kompilátor vždy generuje kód, který podporuje asynchronní strukturované zpracování výjimek (SEH). Ve výchozím nastavení (to znamená, že pokud není zadána žádná /EHsc/EHs, nebo /EHa možnost), kompilátor podporuje SEH obslužné rutiny v nativní klauzuli C++catch(...). Generuje ale také kód, který podporuje pouze částečně výjimky jazyka C++. Výchozí kód uvolnění výjimky nezničí automatické objekty C++ mimo try bloky, které kvůli výjimce přejdou mimo obor. Při vyvolání výjimky jazyka C++ může dojít k úniku prostředků a nedefinované chování.

Standardní zpracování výjimek C++

Úplná podpora kompilátoru pro model zpracování výjimek Standard C++, který bezpečně odvíjí objekty zásobníku vyžaduje /EHsc (doporučeno), /EHsnebo /EHa.

Pokud použijete /EHs nebo /EHsc, nebudou catch vaše catch(...) klauzule asynchronní strukturované výjimky. Všechna porušení přístupu a spravované System.Exception výjimky se nezachytnou. A objekty v oboru, když dojde k asynchronní výjimce, nejsou zničeny, i když kód zpracovává asynchronní výjimku. Toto chování je argument pro ponechání strukturovaných výjimek neošetřených. Místo toho zvažte tyto výjimky jako závažnou.

Při použití /EHs nebo /EHsc, kompilátor předpokládá, že výjimky mohou nastat pouze u throw příkazu nebo při volání funkce. Tento předpoklad umožňuje kompilátoru eliminovat kód pro sledování doby života mnoha neotvíjených objektů, což může výrazně snížit velikost kódu. Pokud použijete /EHa, může být spustitelná image větší a pomalejší, protože kompilátor neoptimalizuje try bloky tak agresivně. Také ponechá v filtrech výjimek, které automaticky vyčistí místní objekty, i když kompilátor nevidí žádný kód, který může throw výjimku jazyka C++.

Strukturované a standardní zpracování výjimek C++

Možnost /EHa kompilátoru umožňuje bezpečné odvíjení zásobníku pro asynchronní výjimky i výjimky jazyka C++. Podporuje zpracování standardních i strukturovaných výjimek jazyka C++ pomocí nativní klauzule C++ catch(...) . K implementaci SEH /EHabez zadání můžete použít __trysyntaxi a , __excepta to .__finally Další informace naleznete v tématu Strukturované zpracování výjimek.

Důležité

/EHa Určení a pokus o zpracování všech výjimek pomocí 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.

I když windows a Visual C++ podporují SEH, důrazně doporučujeme používat zpracování výjimek standardu ISO (/EHsc nebo /EHs). Díky tomu je váš kód přenosnější a flexibilnější. Někdy může být nutné použít SEH starší verze kódu nebo pro konkrétní druhy programů. Vyžaduje se v kódu zkompilovaném pro podporu modulu CLR (/clrCommon Language Runtime), například. Další informace naleznete v tématu Strukturované zpracování výjimek.

Doporučujeme nikdy propojit soubory objektů kompilované pomocí kompilovaných pomocí /EHa /EHs nebo /EHsc ve stejném spustitelném modulu. Pokud potřebujete zpracovat asynchronní výjimku pomocí /EHa libovolného místa v modulu, použijte /EHa ke kompilaci veškerého kódu v modulu. Syntaxi strukturovaného zpracování výjimek můžete použít ve stejném modulu jako kód, který je zkompilován pomocí /EHs. Syntaxi ale nemůžete kombinovat SEH s jazykem C++ trythrowa catch ve stejné funkci.

Použijte /EHa , pokud chcete výjimku catch , která je vyvolána něčím jiným 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;
    }
}

Zpracování výjimek v /clr

Možnost /clr znamená /EHa (to znamená, /clr /EHa že je redundantní). Kompilátor vygeneruje chybu, pokud /EHs nebo /EHsc je použita po /clr. Optimalizace toto chování neovlivňují. Při zachycení výjimky kompilátor vyvolá destruktory třídy pro všechny objekty, které jsou ve stejném oboru jako výjimka. Pokud se výjimka nezachytí, tyto destruktory se nespustí.

Informace o omezeních zpracování výjimek najdete v /clrtématu _set_se_translator.

Kontroly výjimek za běhu

Možnost /EHr vynutí kontroly ukončení modulu runtime ve všech funkcích, které mají noexcept atribut. Ve výchozím nastavení je možné optimalizovat kontroly za běhu, pokud back-end kompilátoru určí, že funkce volá pouze nevyvolá funkce, které nevyvolají vyvolání funkcí. Funkce, které nevyvolávají, jsou všechny funkce, které mají atribut, který určuje, že není možné vyvolat výjimky. Zahrnují funkce označené noexceptjako , throw(), __declspec(nothrow)a pokud /EHc jsou zadány, extern "C" funkce. Funkce, které nejsou vyvolání, zahrnují také všechny, které kompilátor určil, nejsou vyvolání kontrolou. Výchozí chování můžete explicitně nastavit pomocí ./EHr-

Nehodící atribut není zárukou, že funkce nemůže vyvolat výjimky. Na rozdíl od chování noexcept funkce kompilátor MSVC považuje výjimku vyvolanou funkcí deklarovanou pomocí throw(), __declspec(nothrow)nebo extern "C" jako nedefinované chování. Funkce, které používají tyto tři atributy deklarace, nevynucují kontroly ukončení modulu runtime pro výjimky. Tuto nedefinovanou chování můžete použít /EHr k identifikaci nedefinovaného chování tím, že kompilátor vynutí vygenerovat kontroly za běhu neošetřené výjimky, které uniknou noexcept funkci.

Nastavení možnosti v sadě Visual Studio nebo programově

Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte Vlastnosti>konfigurace C/C++>Generování kódu.

  3. Upravte vlastnost Enable C++ Exceptions.

    Nebo nastavte možnost Povolit výjimky C++ na Ne a potom na stránce vlastností příkazového řádku v poli Další možnosti přidejte možnost kompilátoru.

Programové nastavení tohoto parametru kompilátoru

Viz také

Možnosti kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC
Zpracování chyb a výjimek
Specifikace výjimek (throw)
Strukturované zpracování výjimek (C/C++)