try, throw a catch – příkazy (C++)
Chcete-li implementovat zpracování výjimek v jazyce C++, použijte try
throw
, a catch
výrazy.
Nejprve pomocí try
bloku uzavřete jeden nebo více příkazů, které mohou vyvolat výjimku.
Výraz throw
signalizuje, že v bloku došlo try
k mimořádné podmínce – často k chybě. Jako operand výrazu můžete použít objekt libovolného throw
typu. Tento objekt je obvykle používán ke sdělování informací o dané chybě. Ve většině případů doporučujeme použít std::exception
třídu nebo jednu z odvozených tříd definovaných ve standardní knihovně. Pokud některá z těchto možností není vhodná, doporučujeme odvodit vlastní třídu výjimek z std::exception
.
Pokud chcete zpracovat výjimky, které mohou být vyvolány, implementujte jeden nebo více catch
bloků bezprostředně za blokem try
. Každý catch
blok určuje typ výjimky, který může zpracovat.
Tento příklad ukazuje try
blok a jeho obslužné rutiny. Předpokládejme, že GetNetworkResource()
získává data přes síťové připojení a že dva typy výjimek jsou uživatelsky definované třídy odvozené z std::exception
. Všimněte si, že výjimky jsou zachyceny odkazem const
v catch
příkazu. Doporučujeme vyvolat výjimky podle hodnoty a zachytit jej podle odkazu const.
Příklad
MyData md;
try {
// Code that could throw an exception
md = GetNetworkResource();
}
catch (const networkIOException& e) {
// Code that executes when an exception of type
// networkIOException is thrown in the try block
// ...
// Log error message in the exception object
cerr << e.what();
}
catch (const myDataFormatException& e) {
// Code that handles another exception type
// ...
cerr << e.what();
}
// The following syntax shows a throw expression
MyData GetNetworkResource()
{
// ...
if (IOSuccess == false)
throw networkIOException("Unable to connect");
// ...
if (readError)
throw myDataFormatException("Format error");
// ...
}
Poznámky
Kód za try
klauzulí je strážený oddíl kódu. Výraz throw
vyvolá výjimku, tj. vyvolá. Blok kódu za catch
klauzulí je obslužná rutina výjimky. Toto je obslužná rutina, která zachytí výjimku, která se vyvolá, pokud jsou typy ve throw
catch
výrazech kompatibilní. Seznam pravidel, která řídí porovnávání typů v blocích, najdete v catch
tématu Vyhodnocení bloků catch. Pokud příkaz catch
místo typu catch
určuje tři tečky (...), blok zpracovává každý typ výjimky. Při kompilaci s /EHa
možností mohou zahrnovat strukturované výjimky jazyka C a systémem generované nebo aplikace generované asynchronní výjimky, jako je ochrana paměti, dělení nulou a porušení s plovoucí desetinnou čárkou. Vzhledem k tomu, že catch
bloky se zpracovávají v programu za účelem nalezení odpovídajícího typu, musí být obslužná rutina se třemi tečky pro přidružený try
blok poslední obslužnou rutinou. Používejte catch(...)
s opatrností. Nepovolujte programu pokračovat, pokud blok catch neví, jak zpracovat konkrétní zachycenou výjimku. catch(...)
Blok se obvykle používá k protokolování chyb a provádění speciálního čištění před zastavením spuštění programu.
Výraz throw
, který neobsahuje žádný operand, znovu načítá výjimku, která se právě zpracovává. Tento formulář doporučujeme při opětovném načítání výjimky, protože tím se zachová informace o polymorfním typu původní výjimky. Takový výraz by se měl použít pouze v catch
obslužné rutině nebo ve funkci, která je volána z obslužné rutiny catch
. Objekt výjimky rethrown je původní objekt výjimky, nikoli kopie.
try {
throw CSomeOtherException();
}
catch(...) {
// Catch all exceptions - dangerous!!!
// Respond (perhaps only partially) to the exception, then
// re-throw to pass the exception to some other handler
// ...
throw;
}
Viz také
Moderní osvědčené postupy jazyka C++ pro výjimky a zpracování chyb
Klíčová slova
Nezpracované výjimky jazyka C++
__uncaught_exception
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro