try, throw a catch – příkazy (C++)

Chcete-li implementovat zpracování výjimek v jazyce C++, použijte trythrow, 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 throwvyvolá 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 throwcatch 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