He leído varios artículos aquí y en los que está bien lanzar una excepción desde el constructor. Sin embargo, he notado que no llama a destructor de la clase base o sus miembros de datos si se lanza una excepción desde el constructor. Consideremos el siguiente ejemplo:lanzando una excepción desde el constructor en C++
#include <iostream>
using namespace std;
struct C
{
C() { cout << __FUNCTION__ << endl; }
~C() { cout << __FUNCTION__ << endl; }
};
struct E: public C
{
C c;
E() { cout << __FUNCTION__ << endl; throw 4; }
~E() { cout << __FUNCTION__ << endl; }
};
int main()
{
E e;
}
$ g++ test.cpp; ./a.exe
C
C
E
terminate called after throwing an instance of 'int'
Aborted (core dumped)
En este caso, el constructor de E lanza una excepción, pero destructor de C como un miembro de datos o como una clase base no se llama. Ahora bien, si el destructor de C realiza alguna operación de limpieza, como cerrar archivos/sockets y eliminar asignaciones de heap, esto puede causar problemas.
Así que mi pregunta es por qué y cuándo está bien lanzar excepciones de los constructores.
Tenga en cuenta que si detecta la excepción en 'main', se invocan los destructores. Ver [aquí] (http://ideone.com/nQemT). –
Antes de acostumbrarse al uso de excepciones, le recomendamos leer [this] (http://stackoverflow.com/questions/1744070/why-should-exceptions-be-used-conservatively) y su pregunta relacionada. – Shahbaz