Szukałem odpowiedzi na to pytanie, ale nie znalazłem.C++ Ramyfikacje ignorowania wyjątku od konstruktora
Kiedy obiekt rzuca wyjątek na końcu konstruktora, czy obiekt jest ważny, czy jest to jeden z "zależny od techniki budowy"?
przykład:
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");
}
}
Program:
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;
}
W tym przykładzie, mogą być stosowane po F1 wyjątkiem złowione, wiedząc, że jest to wartość w przybliżeniu?
Elementy danych zostały skonstruowane i zainicjowane.
Nie widzę żadnej reguły języka C++, która jest naruszona przez powyższe.
Edytuj: Zmieniono wartość delta błędu z 5.0E05 na 5.0E-5.
Czy naprawdę masz dostęp do f1 za zasięgiem? – nusi
Tak więc wyzwaniem jest wtedy, jak użyć obiektu, który ma konstrukcję * nieudaną *. Być może jest to dobry temat dla SO wiki. –
** Absolutnie niemożliwe. ** Kiedy zostanie zgłoszony wyjątek, będzie propagował na zewnątrz. Oznacza to, że opuszcza obecny zakres, sprawdza, czy można go złapać, a jeśli nie, powtarza. Kiedy konstruktor zgłasza wyjątek, * bardzo * pierwszy zakres, który zostaje, jest tym, za którego obiekt jest tworzony za każdym razem. Albo dlatego, że jest bezpośrednio w bloku try/catch, albo dlatego, że musi opuścić zakres, aby go znaleźć. – GManNickG