Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключение нужно бросить в конструкторе. Как поступаете в таких случаях? 
V
    Опции темы
 
Исключения, бросаемые в конструкторе, - что вы с ними делаете?
ничего не делаю: надо бросить - бросаю [ 24 ]  [48.98%]
стараюсь не бросать исключений в конструкторах, но иногда приходится [ 11 ]  [22.45%]
никогда не бросаю исключений в конструкторах [ 8 ]  [16.33%]
бросаю исключения только в конструкторах [ 1 ]  [2.04%]
не выбрасываю исключение, а делаю что-то другое (написать, что именно). [ 5 ]  [10.20%]
Всего проголосовавших: 49
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
vadiml
Дата 12.1.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



как писали выше, можно заворачивать вызов конструктора. Правда я для этого не пишу специальную статическую функцию. Такое надо очень редко и хватает обычной функции, которая вернёт указатель или NULL, а далее if ( retval == NULL ) { что-то по этому поводу сделать }. Так же в такую функцию часто добавляю вывод в stderr, что бы сразу это видеть.



Это сообщение отредактировал(а) vadiml - 12.1.2008, 16:14
PM MAIL Jabber   Вверх
chipset
Дата 21.1.2008, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Пишу специальное исключение. Если не сгенерировался обьект то лучше всего убить программу пока не поздно и записать в лог подробности. Допустим на серверах так и делается обычно.

А что-бы избежать ситуации: имеем два обьекта А и Б, А инициализирован, Б нет -- чо делать ё? стараюсь что-бы у каждого обьекта был только один указатель на данные которые он обрабатывает.

Это выглядит вот так:

Код

class IntArray : ReferenceCountedStorage<vector<int> > 
{
/* vector<int> *m_dataPtr; //taken care by RCS */
public:
//функции которые работают с m_dataPtr
};



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
UnrealMan
Дата 25.1.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(chipset @  21.1.2008,  05:29 Найти цитируемый пост)
А что-бы избежать ситуации: имеем два обьекта А и Б, А инициализирован, Б нет -- чо делать ё?

Использовать smart pointer-ы или try + catch.
PM MAIL   Вверх
Lycifer
Дата 4.8.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Вообще исключения в конструкторах очень опастно
пример
class A
{
public:
      A()
    {
throw 1;
    }
};
class B : A
{
public:
      B()
    {

    }
};

решение проблемы

class A
{
protected:
bool IsCreateBad;
A(bool)
{
}
public:
      A():IsCreateBad(false)
    {
throw 1;
    }
bool getCreateObject()
{
return IsCreateBad;
}
};
class B : A
{
protected:
B(bool isCreateBad) 
    {
    }
public:
      B() try
    {
    }
catch(...)
{
(*this) = B(true);
}
};

Добавлено через 11 минут и 46 секунд
Ну почемуто возникает assert вопрос почему?

PM MAIL ICQ   Вверх
bsa
Дата 4.8.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Lycifer, проблемы нет там, где ты думаешь, что она есть. Так как если конструктор кидает исключение, значит он не смог сконструировать объект класса, значит конструктор потомка не должен даже запускаться.
PM   Вверх
SABROG
Дата 5.8.2008, 00:07 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Так забавно наблюдать за зверушками, которые копашатся в клетке пытаясь решить какие-то проблемы. Сразу вспоминается Си и ассемблер, где вся ответственность ложится на тебя. И в качестве бонуса дается некоторая порция свободы действий.

По теме. Исключения почти никогда не использовал, т.к. небыло необходимости. Обычно проблемы решаются достаточно тривиальными проверками на уровне возвращаемого значения true или false. Уж не знаю как вы, а для меня исключения это не более чем int 3 или деление на 0, а остальное от лукавого.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
vinter
Дата 5.8.2008, 07:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(SABROG @  5.8.2008,  01:07 Найти цитируемый пост)
Уж не знаю как вы, а для меня исключения это не более чем int 3 или деление на 0, а остальное от лукавого. 
--------------------

значит ты просто не понимаешь исключений.



--------------------
Мой блог
PM MAIL WWW   Вверх
W4FhLF
Дата 5.8.2008, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(SABROG @  5.8.2008,  00:07 Найти цитируемый пост)
 Исключения почти никогда не использовал, т.к. небыло необходимости.


Это тебя не красит. smile 

Почитай Exception vs Error Code


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lycifer
Дата 5.8.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Цитата

Lycifer, проблемы нет там, где ты думаешь, что она есть. Так как если конструктор кидает исключение, значит он не смог сконструировать объект класса, значит конструктор потомка не должен даже запускаться.

А потом оброщение к не существующей памяти, или try и catch где объект создаётся ставить?(Лучше это сделать в класе вот только не получилось  smile ,почему не могу понять)
PM MAIL ICQ   Вверх
vinter
Дата 5.8.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Lycifer @  5.8.2008,  10:49 Найти цитируемый пост)
А потом оброщение к не существующей памяти, или try и catch где объект создаётся ставить?

без try\catch будет вызван termination(); и программа упадет.


--------------------
Мой блог
PM MAIL WWW   Вверх
Partizan
Дата 5.8.2008, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Кстати говоря, двухфазные конструкторы в Symbian решают аналогичные проблемы...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Torsten
Дата 5.8.2008, 11:27 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: 3
Всего: 7



Цитата
стараюсь не бросать исключений в конструкторах, но иногда приходится

хотя в основном, практически всегда создаю метод Init, где и произвожу все сложную инициализацию, которая может привести к проблемам.
Вообще исключение не люблю, код от них бухнет и его трудно читать, поэтому стараюсь их всегда избегать.

Это сообщение отредактировал(а) Torsten - 5.8.2008, 11:28
--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
Lazin
Дата 5.8.2008, 11:39 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Torsten @  5.8.2008,  11:27 Найти цитируемый пост)
Вообще исключение не люблю, код от них бухнет и его трудно читать, поэтому стараюсь их всегда избегать.

еще один пациент smile 
PM MAIL Skype GTalk   Вверх
Lycifer
Дата 5.8.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Цитата

без try\catch будет вызван termination(); и программа упадет. 
 - и это хорошо?
PM MAIL ICQ   Вверх
Peter
Дата 5.8.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Цитата(Mayk @  11.1.2008,  20:14 Найти цитируемый пост)
есть мнение что в подобном случае следует заводить ф-цию init и вызывать её, дабы в случае чего деструктор уничтожал объект

Цитата(Torsten @  5.8.2008,  11:27 Найти цитируемый пост)
хотя в основном, практически всегда создаю метод Init, где и произвожу все сложную инициализацию, которая может привести к проблемам

И я так же поступаю. Конструкторы у меня ничего опасного не делают. Всё опасное выносится в функцию инициализации - а ей-то уж возвращать значение не запрещается.



--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0741 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.