Обработать исключение конструктора
От: igna Россия  
Дата: 09.11.10 07:35
Оценка: :)
Как лучше обработать исключение возникающее в конструкторе не включая в 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.