W zależności od tego, jak zostały ułożone hierarchii wyjątku, ponownie rzuca wyjątek nazywając zmienną wyjątku w instrukcji throw może plaster oryginalny obiekt wyjątku.
Rzut ekspresja bez argumentem rzuci aktualny obiekt wyjątku zachowaniu jego dynamicznego typu, podczas gdy ekspresja rzut z argumentem rzuci nowy wyjątek oparty na statycznej typu argumentu throw
.
E.g.
int main()
{
try
{
try
{
throw Derived();
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
throw b;
}
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
}
return 0;
}
Jak napisano powyżej, program wyświetli:
Caught a reference to base
Derived
Caught a reference to base
Base
Jeśli throw b
jest wymienić na throw
, a następnie zewnętrzna połów będzie również złapać pierwotnie rzucone Derived
wyjątek. To nadal zachowuje, jeśli klasa wewnętrzna przechwytuje wyjątek o wartości, a nie odwołanie - chociaż oczywiście oznaczałoby to, że oryginalny obiekt wyjątku nie może być modyfikowany, więc wszelkie zmiany w b
nie będą odzwierciedlane w wyjątku Derived
przechwyconym przez blok zewnętrzny .
Ah, zupełnie zapomniałem o krojeniu! Cholera, to ważne! Dziękuję za to. +1 (Chociaż myślę, że kiedy napisałeś "... zachowując oryginalny typ statyczny ...", miałeś na myśli typ _dynamiczny.To się nazywa _dynamiczny typ_, jeśli nie _ _ oryginalny typ statyczny "_.) - – sbi
Świetne odpowiedź, zupełnie o tym też zapomniałem. – GManNickG
Cieszę się, że ktoś inny wpadł na problem _slicing_;) –