Обработать исключение конструктора
От: 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);
}
Re: Обработать исключение конструктора
От: jazzer Россия Skype: enerjazzer
Дата: 09.11.10 09:23
Оценка:
Здравствуйте, igna, Вы писали:

I>Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке?


Зачем?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Обработать исключение конструктора
От: igna Россия  
Дата: 09.11.10 09:27
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Зачем?


Есть класс, из конструктора которого неизвестно что может вылететь. Не хотелось бы мешать обработку этих исключений с обработкой других.
Re: Обработать исключение конструктора
От: Bell Россия  
Дата: 09.11.10 09:38
Оценка:
Здравствуйте, igna, Вы писали:

Ээээ... вынести инициализацию в отдельную функцию?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Обработать исключение конструктора
От: igna Россия  
Дата: 09.11.10 09:42
Оценка:
Здравствуйте, Bell, Вы писали:

B>Ээээ... вынести инициализацию в отдельную функцию?


В смысле, изменить класс X?
Re[3]: Обработать исключение конструктора
От: MasterZiv СССР  
Дата: 09.11.10 09:43
Оценка:
On 09.11.2010 12:27, igna wrote:

> J>Зачем?

>
> Есть класс, из конструктора которого неизвестно что может вылететь. Не хотелось
> бы мешать обработку этих исключений с обработкой других.

Зачем ?
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Обработать исключение конструктора
От: igna Россия  
Дата: 09.11.10 09:48
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Зачем ?


Чтобы выдать более вразумительное сообщение об ошибке.
Re[5]: Обработать исключение конструктора
От: MasterZiv СССР  
Дата: 09.11.10 10:01
Оценка:
On 09.11.2010 12:48, igna wrote:
> Здравствуйте, MasterZiv, Вы писали:
>
> MZ>Зачем ?
>
> Чтобы выдать более вразумительное сообщение об ошибке.

catch( std::exception& e )
{
printf( "error %s\n", e.what() );
}

Они все одинаковые, не важно, откуда вылетели.
Posted via RSDN NNTP Server 2.1 beta
Re: Обработать исключение конструктора
От: _nn_  
Дата: 09.11.10 10:15
Оценка: 6 (1)
Здравствуйте, igna, Вы писали:

I>Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке? Придумал два варианта, один хуже другого:


Так ?
struct X { X(int) {} };

boost::optional<X> x;
try
{
 x = boost::in_place(1);
}
catch (exception const&)
{
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Обработать исключение конструктора
От: igna Россия  
Дата: 09.11.10 10:45
Оценка:
Здравствуйте, _nn_, Вы писали:

__>boost::optional<X> x;
__>try
__>{
__> x = boost::in_place(1);
__>}
__>catch (exception const&)
__>{
__>}


Спасибо, это супер! Если не ошибаюсь, единственным "недостатком" в этом решении является наличие дополнительной member variable m_initialized в optional<X>?
Re[3]: Обработать исключение конструктора
От: _nn_  
Дата: 09.11.10 11:06
Оценка: 6 (1)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, _nn_, Вы писали:


I>
__>>boost::optional<X> x;
__>>try
__>>{
__>> x = boost::in_place(1);
__>>}
__>>catch (exception const&)
__>>{
__>>}
I>


I>Спасибо, это супер! Если не ошибаюсь, единственным "недостатком" в этом решении является наличие дополнительной member variable m_initialized в optional<X>?


Можно его ,конечно, устранить, если вам очень нужно.

По сути boost::optional выполняет две роли: 1. опциональное значение, 2. улучшенный placement new.
Можно сделать класс, который не будет содержать m_initialized и не будет поддерживать опциональное значение, но вы будете обязаны вызвать конструктор раньше других методов.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Обработать исключение конструктора
От: sokel Россия  
Дата: 09.11.10 11:15
Оценка: 4 (1)
Здравствуйте, igna, Вы писали:

I>Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке? Придумал два варианта, один хуже другого:


I>
I>  char x_place[sizeof(X)];
I>

Эмм... а как насчет segfault?
Re[2]: Обработать исключение конструктора
От: sokel Россия  
Дата: 09.11.10 11:20
Оценка:
Здравствуйте, sokel, Вы писали:

I>>
I>>  char x_place[sizeof(X)];
I>>

S>Эмм... а как насчет segfault?

упс... в смысле SIGBUS
Re[3]: Обработать исключение конструктора
От: TimurSPB Интернет  
Дата: 09.11.10 11:30
Оценка: 2 (1)
Здравствуйте, sokel, Вы писали:

S>Здравствуйте, sokel, Вы писали:


I>>>
I>>>  char x_place[sizeof(X)];
I>>>

S>>Эмм... а как насчет segfault?

S>упс... в смысле SIGBUS



Под виндой buss error отсутствует, так что порядок А вот под спарк это будет весело.
Make flame.politics Great Again!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.