Jak bloky Catch jsou hodnoceny (C++)
C++ umožňuje vyvolávají výjimky libovolného typu, přestože obecně doporučuje vyvoláním typy, které jsou odvozeny z std::exception.Můžete C++ výjimka zachycena úlovku rutinu, která určuje stejného typu jako thrown výjimku nebo Handler, který může zachytit jakýkoli typ výjimky.
Pokud je typ výjimky, thrown třídy, který má také základní třídy (nebo tříd), může být obslužné rutiny, které podporují základní třídy výjimka typu, stejně jako odkazy na základy typ výjimky, zachycena.Všimněte si, že když je výjimka zachycena odkaz, je vázán k objektu skutečné thrown výjimky; jinak je kopie (podobný jako argument funkce).
Když je vyvolána výjimka, může být zachycena následující druhy úlovku obsluhy:
Obslužná rutina, který může přijmout jakýkoli typ (pomocí syntaxe třemi tečkami).
Obslužná rutina, která přijímá stejného typu jako objekt výjimky; protože je kopie, const a volatile modifikátory jsou ignorovány.
Obslužná rutina, která přijímá odkaz na stejný typ jako objekt výjimky.
Obslužná rutina, která přijímá odkaz na const nebo volatile formuláře stejného typu jako objekt výjimky.
Obslužná rutina, která přijímá základní třídy stejného typu jako objekt výjimky; protože je kopie, const a volatile modifikátory jsou ignorovány.Úlovku obslužnou rutinu pro základní třídy není musí předcházet úlovku obslužnou rutinu pro odvozené třídy.
Obslužná rutina, která přijímá odkaz na základní třídy stejného typu jako objekt výjimky.
Obslužná rutina, která přijímá odkaz na const nebo volatile formulář základní třídy stejného typu jako objekt výjimky.
Obslužná rutina, která přijímá ukazatele, které lze převést objekt thrown ukazatel přes standardní ukazatel pravidla převodu.
Pořadí, v jakém úlovku obslužné rutiny se zobrazí, je významný, protože obslužné rutiny pro dané akci bloku se zkontrolují v pořadí jejich vzhled.Například je chyba umístit obslužnou rutinu pro základní třídy před obslužnou rutinu pro odvozené třídy.Po odpovídající úlovku popisovač je nalezen, následující obslužné rutiny není zkoumána.Jako výsledek Výpustek úlovku zpracování musí být poslední popisovač pro jeho akci bloku.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 se třemi tečkami úlovku zpracování je jedinou obslužnou rutinu, která je zkontrolován.