Selon la façon dont vous avez organisé votre hiérarchie d'exception, re-lancer une exception en nommant la variable d'exception dans l'instruction throw peut tranche l'objet d'exception d'origine.
Une expression throw sans argument jeter l'objet d'exception actuelle en préservant son type dynamique, alors qu'une expression de jet avec un argument lancer une nouvelle exception en fonction du type statique de l'argument à 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;
}
Comme écrit ci-dessus, le programme de sortie:
Caught a reference to base
Derived
Caught a reference to base
Base
Si le throw b
est le remplacer par un throw
, puis la prise extérieure attrapera également l'exception Derived
initialement lancée. Cela reste valable si la classe interne intercepte l'exception Base
par valeur plutôt que par référence - bien que cela signifie naturellement que l'objet d'exception original ne peut pas être modifié, donc aucune modification à b
ne sera reflétée dans l'exception Derived
interceptée par le bloc externe .
Ah, j'ai complètement oublié de trancher! Bon sang, c'est important! Merci d'avoir soulevé cette question. +1 (Bien que je pense quand vous avez écrit "... en préservant le type statique original ...", vous vouliez dire _dynamic_ type, ce qui s'appelle _dynamic type_, après tout, sinon le _ "type statique original" _.) - – sbi
Great répondre, j'ai complètement oublié à ce sujet aussi. – GManNickG
Je suis heureux que quelqu'un d'autre a rencontré le problème _slicing_;) –