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

Určuje podporu modelu zpracování výjimek vygenerované kompilátorem. Argumenty určují, zda se má použít syntaxe pro strukturované i standardní výjimky jazyka C++, zda je kód catch(...)catch(...) považován za výjimky a zda se mají určité kontroly thrownoexcept optimalizovat.

Syntax

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

Argumenty

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

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

c
Při použití s předpokládá kompilátor, že funkce /EHs deklarované /EHsthrow nikdy výjimku jazyka C++. Nemá žádný vliv, pokud se používá s /EHa (to znamená, /EHca že je ekvivalentní /EHa ). /EHc se /EHs ignoruje, pokud není zadaný parametr nebo /EHa .

r
Říká kompilátoru, aby vždy vygeneroval kontroly ukončení modulu runtime pro všechny noexcept funkce. Ve výchozím nastavení může být modul runtime kontroluje může být optimalizována mimo, pokud kompilátor zjistí, že funkce noexcept volá pouze jiné než throw ing funkce. Tato možnost poskytuje striktní shodu jazyka C++ za cenu určitého dodatečného kódu. /EHr se /EHs ignoruje, pokud není zadaný parametr nebo /EHa .

-
Vymaže předchozí argument možnosti. Například je /EHsc- interpretován jako /EHs /EHc- a je ekvivalentní k /EHs .

/EH Argumenty lze zadat samostatně nebo zkombinovat v libovolném pořadí. Pokud je zadáno více instancí stejného argumentu, poslední instance přepíše všechny předchozí argumenty. Například je /EHr- /EHc /EHs stejný jako a má stejný účinek jako /EHscr-/EHscr- /EHr/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í (pokud není zadána možnost , nebo ), kompilátor podporuje obslužné rutiny /EHsc/EHs v nativní /EHaSEH klauzuli jazyka catch(...) C++. Generuje však také kód, který podporuje pouze částečně výjimky jazyka C++. Výchozí kód pro odvíjení výjimek neničí automatické objekty C++ mimo try -throw -and- catch -statements-cpp" data-linktype="relative-path">try bloky, které jsou kvůli výjimce mimo rozsah. Pokud je výjimka jazyka C++ n, může dojít k nevrácení prostředků a nedefinované throw chování.

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

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

Pokud /EHs použijete nebo /EHsc , vaše catch(...) klauzule nejsou asynchronní strukturované catch výjimky. Jakákoli porušení přístupu a spravované výjimky System.Exception jsou nezachycené. Objekty v oboru, pokud dojde k asynchronní výjimce, nejsou zničeny ani v případě, že 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žné.

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

Strukturované a standardní zpracování výjimek jazyka 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 výjimek jazyka C++ i strukturovaných výjimek pomocí nativní klauzule jazyka catch(...) C++. Pokud chcete SEH implementovat bez zadání , můžete použít /EHa__try syntaxi , a __except__finally . Další informace najdete v tématu Strukturované zpracování výjimek.

Důležité

Určení a ing pro zpracování všech výjimek pomocí /EHa nástroje může být trycatch(...) 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í , důrazně doporučujeme použít zpracování výjimek SEH C++ standardního standardu ISO ( /EHsc nebo /EHs ). Díky tomu je váš kód přenosnější a flexibilnější. Stále může být možné, že budete muset použít ve SEH starší verzi kódu nebo pro konkrétní druhy programů. Vyžaduje se například v kódu zkompilovaném pro podporu modulu CLR (Common Language Runtime) /clr ( ). Další informace najdete v tématu Strukturované zpracování výjimek.

Doporučujeme nikdy propojit soubory objektů zkompilované pomocí s soubory zkompilované pomocí nebo /EHa/EHs ve stejném /EHsc spustitelném modulu. Pokud potřebujete zpracovat asynchronní výjimku pomocí libovolného místa v modulu, použijte ke kompilaci /EHa/EHa 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 zkompilovaný pomocí /EHs . Syntaxi ale nelze kombinovat SEH s C++ try , a ve stejné throwcatch funkci.

Tuto možnost použijte, pokud chcete výjimku, která je vyvolána /EHacatch jiným objektem než throw . Tento příklad catch vygeneruje a es strukturovaná výjimka:

// 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 rámci /clr

Parametr /clr implikuje /EHa (to znamená, že /clr /EHa je redundantní). Kompilátor vygeneruje chybu, pokud /EHs se používá nebo po /EHsc/clr . Optimalizace toto chování neovlivňuje. Když je výjimka zachycena, kompilátor vyvolá destruktory třídy pro všechny objekty, které jsou ve stejném oboru jako výjimka. Pokud výjimka není zachycena, tyto destruktory nejsou spuštěny.

Informace o omezeních zpracování výjimek v systému /clr najdete /clr.

Kontroly výjimek modulu runtime

Možnost /EHr vynutí ukončení modulu runtime kontroly ve všech funkcích, které mají noexcept atribut. Ve výchozím nastavení lze kontroly modulu runtime optimalizovat, pokud back-end kompilátoru určí, že funkce volá pouze neingové funkce. Neingovací funkce jsou všechny funkce, které mají atribut , který určuje, že žádné throw výjimky nemusí být throw n. Obsahují funkce s označením , , a noexceptthrow() , pokud jsou __declspec(nothrow)/EHc zadány, extern "C" funkce. Jiné než ingingové funkce zahrnují také všechny funkce, které kompilátor určil, že nejsou throwthrow inging kontrolou. Výchozí chování můžete explicitně nastavit pomocí /EHr- .

Atribut, který není ing, není zárukou, že výjimky nemůže throwthrow být n funkcí. Na rozdíl od chování funkce kompilátor MSVC výjimku n funkcí deklarovanou pomocí , nebo jako noexceptthrowthrow()__declspec(nothrow)extern "C" nedefinované chování. Funkce, které používají tyto tři atributy deklarace, nevynucuje kontroly ukončení modulu runtime pro výjimky. Pomocí možnosti můžete toto nedefinované chování identifikovat tak, že kompilátor vynutí generování kontrol modulu runtime pro neošetřené výjimky, které uniknou /EHrnoexcept funkci.

Nastavení možnosti v 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 Visual Studio .

  2. Vyberte Vlastnosti konfiguraceGenerování kódu C/C++.

  3. Upravte vlastnost Povolit výjimky jazyka C++.

    Nebo nastavte povolit výjimky jazyka C++ na Nea pak na stránce vlastností příkazového řádku přidejte do pole Další možnosti možnost kompilátoru.

Programové nastavení tohoto parametru kompilátoru

Viz také

MSVC kompilátoru
MSVC příkazového řádku nástroje MSVC Compiler
Zpracování chyb a výjimek
throw -cpp" data-linktype="relative-path">Specifikace výjimek ( throw )
Strukturované zpracování výjimek (C/C++)