Dependiendo de cómo se ha organizado su jerarquía de excepciones, vuelva a lanzar una excepción al nombrar la variable de excepción en la sentencia throw puede rebanada el objeto excepción original.
Una expresión tiro sin argumentos arrojará el objeto de excepción actual conservando su tipo dinámico, mientras que una expresión de tiro con un argumento lanzará una nueva excepción basada en la estática tipo del argumento a 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;
}
Como se ha dicho anteriormente, el programa sería:
Caught a reference to base
Derived
Caught a reference to base
Base
Si el throw b
es reemplazar con un throw
, entonces la captura externa también coger el lanzado originalmente Derived
excepción. Esto todavía se cumple si la clase interna capta la excepción Base
por valor en lugar de referencia, aunque, naturalmente, esto significaría que el objeto de excepción original no se puede modificar, por lo que cualquier cambio a b
no se reflejaría en la excepción Derived
atrapada por el bloque externo .
¡Ah, me olvidé por completo de rebanar! ¡Maldita sea, eso es importante! Gracias por mencionar esto. +1 (Aunque creo que cuando escribiste "... preservando el tipo estático original ..." querías decir el tipo _dynamic_. Lo que se llama _tynamic type_, después de todo, si no el _ "original static type" _.) - – sbi
Great respuesta, me olvidé completamente de eso también. – GManNickG
Estoy feliz de que alguien más se haya encontrado con el problema _slicing_;) –