Sdílet prostřednictvím


Postup vyhodnocení zachytávacího bloku (C++)

Jazyk C++ umožňuje vyvolat výjimky jakéhokoli typu, obecně je však doporučeno vyvolávat typy odvozené z typu std::exception.Výjimku C++ lze zachytit obslužnou rutinou catch, která určuje typ shodný s vyvolanou výjimkou, nebo obslužnou rutinou, která zachycuje všechny typy výjimek.

Je-li typem vyvolané výjimky třída, která má také základní třídu (nebo třídy), lze ji zachytit obslužnými rutinami přijímajícími základní třídy i reference na základy daného typu výjimky.Povšimněte, si, že je-li výjimka zachycena referencí, je svázána se skutečným objektem vyvolané výjimky. V ostatních případech jde o kopii (obdobně jako argument funkce).

Jakmile dojde k vyvolání výjimky, lze ji zachytit následujícími typy obslužné rutiny catch:

  • Obslužná rutina, která může přijmout libovolný typ (pomocí syntaxe tří teček).

  • Obslužná rutina, která může přijmout typ shodný s objektem výjimky. Jelikož jde o kopii, jsou modifikátory const a volatile ignorovány.

  • Obslužná rutina přijímající reference na typ shodný s objektem výjimky.

  • Obslužná rutina přijímající referenci na tvar typu shodného s objektem výjimky obsahujícího modifikátor const nebo volatile.

  • Obslužná rutina přijímající základní třídu typu shodného s objektem výjimky. Jelikož jde o kopii, jsou modifikátory const a volatile ignorovány.Obslužná rutina catch pro základní třídu nesmí předcházet obslužnou rutinu catch pro odvozenou třídu.

  • Obslužná rutina přijímající referenci na základní třídu typu shodného s objektem výjimky.

  • Obslužná rutina přijímající referenci na tvar typu shodného s objektem výjimky obsahujícího modifikátor const nebo volatile.

  • Obslužná rutina přijímající ukazatel, na nějž lze vyvolaný objekt ukazatele převést dle standardních pravidel pro převod ukazatelů.

Pořadí, v němž jsou obslužné rutiny catch uvedeny, nelze zanedbat, protože obslužné rutiny pro daný blok try jsou vyšetřovány v pořadí jejich výskytu.Chybou je například umístit obslužnou rutinu základní třídy před obslužnou rutinu odvozené třídy.Po nalezení odpovídající obslužné rutiny catch nebudou další obslužné rutiny vyšetřeny.V důsledku toho musí být obslužná rutina catch se třemi tečkami poslední obslužnou rutinou svého bloku try.Příklad:

// ...
try
{
    // ...
}
catch( ... )
{
    // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
    cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
    // Handle CExcptClass exception here.
}

V tomto příkladu je obslužná rutina catch se třemi tečkami jedinou vyšetřenou obslužnou rutinou.

Viz také

Referenční dokumentace

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