/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 /EHs
kompilá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), /EHs
nebo /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 /EHa
bez zadání můžete použít __try
syntaxi a , __except
a 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 (/clr
Common 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++ try
throw
a 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 /clr
té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é noexcept
jako , 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
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Vyberte Vlastnosti>konfigurace C/C++>Generování kódu.
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 třída ExceptionHandling.
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++)