Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке? Придумал два варианта, один хуже другого:
#include <cstdlib>
#include <iostream>
#include <new>
using namespace std;
class E {};
class X {
public:
X(int i)
{
if (i % 2)
throw E();
}
};
void f(X const&, int i)
{
if (i % 3)
throw E();
}
int main(int argc, char*[])
{
#ifdef USE_PLACEMENT_NEW
char x_place[sizeof(X)];
X* x_ptr;
try {
x_ptr = new (x_place) X(argc);
}
catch (E const&) {
cerr << "Exception in X::X(int)\n";
return 1;
}
X& x = *x_ptr;
#else
struct x : X {
x(int i) try : X(i) {}
catch (E const&) {
cerr << "Exception in X::X(int)\n";
exit(1);
}
} x(argc);
#endif
f(x, argc);
}
Здравствуйте, igna, Вы писали:
I>Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке?
On 09.11.2010 12:27, igna wrote:
> J>Зачем? > > Есть класс, из конструктора которого неизвестно что может вылететь. Не хотелось > бы мешать обработку этих исключений с обработкой других.
Здравствуйте, igna, Вы писали:
I>Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке? Придумал два варианта, один хуже другого:
Так ?
struct X { X(int) {} };
boost::optional<X> x;
try
{
x = boost::in_place(1);
}
catch (exception const&)
{
}
Спасибо, это супер! Если не ошибаюсь, единственным "недостатком" в этом решении является наличие дополнительной member variable m_initialized в optional<X>?
I>Спасибо, это супер! Если не ошибаюсь, единственным "недостатком" в этом решении является наличие дополнительной member variable m_initialized в optional<X>?
Можно его ,конечно, устранить, если вам очень нужно.
По сути boost::optional выполняет две роли: 1. опциональное значение, 2. улучшенный placement new.
Можно сделать класс, который не будет содержать m_initialized и не будет поддерживать опциональное значение, но вы будете обязаны вызвать конструктор раньше других методов.
Здравствуйте, igna, Вы писали:
I>Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке? Придумал два варианта, один хуже другого:
I>