De acuerdo con the C++ FAQ, cuando uno arroja un objeto, se lanza utilizando el tipo estático de la expresión. Por lo tanto, si usted tiene:Justificación para arrojar tipos estáticos?
catch (some_exception const &e) {
// ...
throw e; // throws static type, possibly causing "slicing"; should just "throw;" instead
}
y e
es realidad una referencia a alguna clase derivada de some_exception
, lo anterior throw
hará que el objeto que se va "rodajas" en silencio. Sí, sé que la respuesta correcta es simplemente throw;
, pero la forma en que están las cosas parece ser una fuente innecesaria de confusión y errores.
¿Cuál es la razón de esto? ¿Por qué no desea arrojar por el tipo dinámico del objeto?
Pero si lo captas por referencia, parecería que simplemente podría volver a lanzar el mismo objeto sin hacer ninguna copia (como lo hace "throw"). –
Luego 'throw x;' se comporta de manera diferente dependiendo de su operando y de si aparece en un bloque 'catch'. El beneficio de tener 'throw x;' distinto de 'throw;' es que el comportamiento de 'throw x;' es siempre el mismo (se hace una copia y esa copia es la que se captura), pero usted todavía tiene la capacidad de vuelva a lanzar la excepción actual si así lo desea. [Probablemente debería tener en cuenta que en algunas circunstancias la copia puede ser eliminada, pero solo si hacerlo no cambia el comportamiento del programa, aparte de la convocatoria de constructores y destructores.] –
+1 Buena explicación. :-) – Nawaz