He buscado SO para obtener una respuesta a esto, pero no he encontrado ninguna.C++ Ramificaciones de ignorar la excepción del constructor
Cuando un objeto arroja una excepción al final del constructor, ¿el objeto es válido o es uno de esos "depende de la técnica de construcción"?
Ejemplo:
struct Fraction
{
int m_numerator;
int m_denominator;
Fraction (double value,
int denominator);
};
Fraction::Fraction(double value, int denominator)
: m_numerator(0), m_denominator(denominator)
{
if (denominator == 0)
{
/* E1 */ throw std::logic_error("Denominator is zero.");
}
m_numerator = static_cast<int>(value * static_cast<double>(denominator));
double actual_value = 0.0;
actual_value = static_cast<double>(m_numerator)/static_cast<double>(m_denominator);
double error = fabs(actual_value - value);
if (error > 5.0E-5)
{
/* E2 */ throw std::logic_error("Can't represent value in exact fraction with given denominator");
}
}
El programa:
int main(void)
{
try
{
Fraction f1(3.14159264, 4); // Throws exception, E2 above.
}
catch (...)
{
cerr << "Fraction f1 not exactly representable as fraction with denom. of 4.\n";
}
// At this point, can I still use f1, knowing that it is an approximate fraction?
return EXIT_SUCCESS;
}
En este ejemplo, puede ser utilizado F1 después se detecta la excepción, sabiendo que es un valor aproximado?
Los miembros de datos se han construido e inicializado.
No veo ninguna regla de lenguaje C++ violada por lo anterior.
Editar: Se ha cambiado el valor delta de error de 5.0E05 a 5.0E-5.
¿Realmente puede acceder a f1 detrás de su alcance? – nusi
Entonces, el desafío es cómo usar un objeto después de que * falló * en la construcción. Tal vez este sea un buen tema para SO wiki. –
** Absolutamente imposible. ** Cuando se lanza una excepción, se propagará hacia afuera. Esto significa que deja el alcance actual, comprueba si se puede atrapar, y si no, se repite. Cuando un constructor lanza una excepción, el * muy * primer ámbito que se deja es el que crea el objeto, cada vez. Ya sea porque está directamente en un bloque try/catch o porque necesita abandonar el alcance para buscar uno. – GManNickG