Как перехватить exception возникший в конструкторе
От: AlxB Украина  
Дата: 27.02.03 13:11
Оценка:
Здраствуйте.

Есть у меня класс, который возбуждает исключителюную ситуацию в конструкторе.

class Aclass
{
  public:
   Aclass(int i)
      { if(i=2) throw Error;}
};


В другом классе я создаю объект класса Aclass

class Bclass
{
 Aclass a;
 public:
  Bclass():a(2)
        {
//          dosomething
        }
};


Так вот, возможно ли в Bclass перехватить exception от Aclass?

Или можно как то по другому создать экземпляр Aclass в Bclass (ну кроме как динамически).

Спасибо.
.
Re: Как перехватить exception возникший в конструкторе
От: Lorenzo_LAMAS  
Дата: 27.02.03 13:16
Оценка:
AB>
AB>      { if(i=2) throw Error;}У тебя уже здесь ошибка:)))
AB>


А если серьезно то так: при возникновении исключения при конструировании В (исключение возникло в конструкторе А), твой объект В не будет создан. Если это был локальный объект, то ты пишешь обычный try/catch блок, если объект глобален — то никак.
Of course, the code must be complete enough to compile and link.
Re: Как перехватить exception возникший в конструкторе
От: bercsoft Россия http://www.34.ru/gameclient/index.html
Дата: 27.02.03 13:21
Оценка:
Здравствуйте, AlxB, Вы писали:

AB>
AB>class Bclass
AB>{
AB> Aclass a;
AB> public:
AB>  Bclass():a(2)
AB>        {
AB>//          dosomething
AB>        }
AB>};
AB>


AB>Так вот, возможно ли в Bclass перехватить exception от Aclass?


А что
try
{
}
catch(...)
{
}
не помагает ?

Удалено избыточное цитирование. -- ПК.
Re: Как перехватить exception возникший в конструкторе
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 27.02.03 13:24
Оценка: 11 (2)
Здравствуйте, AlxB, Вы писали:

AB>Так вот, возможно ли в Bclass перехватить exception от Aclass?


По Стандарту, можно сделать function-try-block
BClass::BClass()
try
    : a(2)
{
    ...
}
catch(...)
{
}


Но не все компиляторы это понимают (например, VC6 такого не умеет)

Кроме того, есть одна особенность. Из обработчика нельзя просто выйти. Если явно не указан throw (другого исключения или того же самого), то выбрасывается исходное исключение. Поэтому эта конструкция довольно редко бывает полезна. Т.к. деструкторы объектов базовых классов и членов, уже созданных на этот момент, вызовутся автоматически, а в тело данного конструктора мы еще не вошли. Можно, правда, вести логи или что-то подобное...

Почитай Constructor Failures. Там все хорошо объясняется.
... << RSDN@Home 1.0 beta 5 >>
Re[2]: Как перехватить exception возникший в конструкторе
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 27.02.03 13:29
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>По Стандарту, можно сделать function-try-block


Соответствующие пункты: 15/3 и 15.3/16
... << RSDN@Home 1.0 beta 5 >>
Re: Как перехватить exception возникший в конструкторе
От: Amor Россия  
Дата: 27.02.03 13:36
Оценка: 2 (1)
Здравствуйте, AlxB, Вы писали:

AB>Здраствуйте.


AB>Есть у меня класс, который возбуждает исключителюную ситуацию в конструкторе.



AB>Так вот, возможно ли в Bclass перехватить exception от Aclass?


AB>Или можно как то по другому создать экземпляр Aclass в Bclass (ну кроме как динамически).


AB>Спасибо.


Недавно я задавал такой вопрос.
У Страуструпа это делается так:
class Aclass
{
  public:
   Aclass(int i)
      { if(i=2) throw Error;}
};

class Bclass
{
 Aclass a;
 public:
  Bclass();
};
Bclass::Bclass()
try
   :a(2)
{
//   dosomething
}
catch(Error&)
{
//  dosmth
}

Но Visual C++ 6.0 этого не поддерживает. Если у тебя другой компилятор — тебе повезло. А вот как быть с VC++6.0 не знаю — и до сих пор не разобрался.
Re[2]: Как перехватить exception возникший в конструкторе
От: Аноним  
Дата: 27.02.03 13:38
Оценка:
Разбираться особо не в чем. Тебе дали неплохую ссылку, там нудно и многословно рассказали как и чего. Так в чем же проблема? Что тебе даст такой перехват исключения? Объект то ведь не будет создан в любом случае.
Re[3]: Как перехватить exception возникший в конструкторе
От: Amor Россия  
Дата: 27.02.03 13:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Разбираться особо не в чем. Тебе дали неплохую ссылку, там нудно и многословно рассказали как и чего. Так в чем же проблема? Что тебе даст такой перехват исключения? Объект то ведь не будет создан в любом случае.


В моем случае — создавался theApp. Если он не создается — было бы не плохо — отловить это исключение и корректно завершить программу. Как это можно сделать?
Re[4]: Как перехватить exception возникший в конструкторе
От: Аноним  
Дата: 27.02.03 13:59
Оценка:
Еще раз. НИКАК.Это глобальный объект. Переписывай тогда main, чтобы theApp создавался в нем (не знаю, можно ли в МФЦ так изгалиться и сделать такое, думаю, сложно).
Re[4]: Как перехватить exception возникший в конструкторе
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 27.02.03 14:02
Оценка:
Здравствуйте, Amor, Вы писали:

A>В моем случае — создавался theApp. Если он не создается — было бы не плохо — отловить это исключение и корректно завершить программу. Как это можно сделать?


Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.

Если он не глобальный, то заключи создание объекта theApp в try/catch.
... << RSDN@Home 1.0 beta 5 >>
Re[5]: Как перехватить exception возникший в конструкторе
От: Amor Россия  
Дата: 27.02.03 14:05
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

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


A>>В моем случае — создавался theApp. Если он не создается — было бы не плохо — отловить это исключение и корректно завершить программу. Как это можно сделать?


ММ>Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.


Как это до входа??? Это ведь вроде — entry point у exe-шника. Как это можно выполнить что-либо до него ???
Re[5]: Как перехватить exception возникший в конструкторе
От: Леночка Россия  
Дата: 27.02.03 14:31
Оценка: 4 (1)
ММ>Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.


Какая тогда функция вызывает конструкторы глобальных обьектов, если не CRTStartup ?
Re[6]: Как перехватить exception возникший в конструкторе
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 27.02.03 14:35
Оценка:
Здравствуйте, Amor, Вы писали:

ММ>>Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.


A>Как это до входа??? Это ведь вроде — entry point у exe-шника. Как это можно выполнить что-либо до него ???


Погорячился... Правильно все же было бы "до входа в main".
... << RSDN@Home 1.0 beta 5 >>
Re[2]: Как перехватить exception возникший в конструкторе
От: AlxB Украина  
Дата: 27.02.03 15:06
Оценка:
Здравствуйте, Amor, Вы писали:

A>Но Visual C++ 6.0 этого не поддерживает. Если у тебя другой компилятор — тебе повезло. А вот как быть с VC++6.0 не знаю — и до сих пор не разобрался.


Нет мне не повезло . Вобщем то меня это больше всего и интересовало. Спасибо всем ответившим.
.
Re[3]: Как перехватить exception возникший в конструкторе
От: AlxB Украина  
Дата: 27.02.03 15:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Разбираться особо не в чем. Тебе дали неплохую ссылку, там нудно и многословно рассказали как и чего. Так в чем же проблема? Что тебе даст такой перехват исключения? Объект то ведь не будет создан в любом случае.


Да конечно, просто мне таким вот путем хотелось узнать почему BClass не создался, потому что в нем что то случилось или AClass "виноват"
.
Re[4]: Как перехватить exception возникший в конструкторе
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 27.02.03 15:18
Оценка:
Здравствуйте, AlxB, Вы писали:

AB>Да конечно, просто мне таким вот путем хотелось узнать почему BClass не создался, потому что в нем что то случилось или AClass "виноват"


Тогда прямой путь:
B::B() :
    a(2)
{
    try
    {
        ...
    }
    catch
    {
        // AClass не виноват
    }
}
... << RSDN@Home 1.0 beta 5 >>
Re[2]: Как перехватить exception возникший в конструкторе
От: MaximE Великобритания  
Дата: 27.02.03 15:25
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Кроме того, есть одна особенность. Из обработчика нельзя просто выйти. Если явно не указан throw (другого исключения или того же самого), то выбрасывается исходное исключение. Поэтому эта конструкция довольно редко бывает полезна. ...


Эта конструкция полезна только для единственной цели — преобразования типа исключения. Это же сказано у Саттера по твоей ссылке.

BClass::BClass()
try
    : a(2)
{
    ...
}
catch(SomeException&)
{
    throw OtherException();
}
Re[4]: Как перехватить exception возникший в конструкторе
От: Павел Кузнецов  
Дата: 27.02.03 15:28
Оценка: 12 (2)
Здравствуйте, AlxB, Вы писали:

А>>Объект то ведь не будет создан в любом случае.


AB>Да конечно, просто мне таким вот путем хотелось узнать почему BClass не создался, потому что в нем что то случилось или AClass "виноват"


Это можно сделать и средствами MSVC++6:

class Bclass
{
   Aclass a;

   Aclass create_a(int i)
   {
     try
     {
       return Aclass(i);
     }
     catch (...)
     {
       // "Виноват" Aclass
       throw;
     }
   }

 public:
   Bclass():a(create_a(2))
   {
      // dosomething
   }
};
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Как перехватить exception возникший в конструкторе
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 27.02.03 15:40
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это можно сделать и средствами MSVC++6:


class Bclass
{
    Aclass a;
    Aclass create_a(int i)
    {
        ...
    }
public:
    Bclass():a(create_a(2))
    {
        // dosomething
    }
};


А что делать, если виноват конструктор копирования AClass ?
... << RSDN@Home 1.0 beta 5 >>
Re[6]: Как перехватить exception возникший в конструторе
От: Павел Кузнецов  
Дата: 27.02.03 16:04
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ПК>> Это можно сделать и средствами MSVC++6: <...>


ММ> А что делать, если виноват конструктор копирования AClass ?


"Это" != "Все"
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.