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

K implementaci zpracování výjimek v jazyce C++ se používají výrazy try, throw a catch.

Nejprve blokem try uzavřete jeden nebo více příkazů, které mohou vyvolat výjimku.

Výraz throw signalizuje, že v bloku try došlo k výjimečné podmínce, často chybě.Jako operand výrazu throw můžete použít objekt jakéhokoli 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 třídu std::exception nebo jednu z odvozených tříd, které jsou definovány ve standardní knihovně.Pokud jedna 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 bloků catch ihned po bloku try.Každý blok catch určuje typ výjimky, kterou může zpracovávat.

Tento příklad ukazuje blok try a jeho obslužné rutiny.Předpokládejme, že GetNetworkResource() získá data přes síťové připojení a že tyto dva typy výjimek jsou třídy definované uživatelem, které jsou odvozeny z std::exception.Všimněte si, že tyto výjimky jsou zachyceny odkazem const v prohlášení catch.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 klauzulí try je chráněná část kódu.Výraz throwvyvolá, tedy vyvolává výjimku.Blok kódu po klauzuli catch je obslužná rutina výjimky.To je rutina, která zachycuje výjimku, která je vyvolána, pokud typy ve výrazech throw a catch jsou kompatibilní.Seznam pravidel, která určují typ shody v blocích catch, se nachází v tématu Postup vyhodnocení zachytávacího bloku (C++).Pokud příkaz catch určuje tři tečky (...) místo typu, blok catch zpracovává každý typ výjimky.Při kompilování s možností /EHa mohou zahrnovat strukturované výjimky jazyka C a systémem či aplikacemi generované asynchronní výjimky, jako je ochrana paměti, dělení nulou a porušení plovoucí desetinné čárky.Vzhledem k tomu, že bloky catch jsou zpracovávány v pořadí programu, aby bylo možné nalézt odpovídající typ, obslužná rutina tří teček musí být poslední obslužnou rutinou pro přidružený blok try.catch(...) používejte opatrně. Nepovolte programu pokračovat, dokud blok catch nebude vědět, jak zpracovat určitou výjimku, která je zachycena.Blok catch(...) obvykle slouží k protokolování chyb a provádění zvláštního vyčištění před zastavením spuštění programu.

Výraz throw, který nemá žádné operandy, znovu vyvolá aktuálně zpracovávanou výjimku.Doporučujeme tento formulář při opětném vyvolávání výjimky, protože se tak zachovají informace o polymorfním typu původní výjimky.Takový výraz by měl být používán pouze v obslužné rutině catch, nebo ve funkci, která je volána z obslužné rutiny catch.Objekt znovu vyvolané výjimky je původní objekt výjimky, ne 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é

Referenční dokumentace

Zpracovávání výjimek v jazyce C++

Klíčová slova jazyka C++

Nezpracované výjimky jazyka C++

__uncaught_exception