
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
собственно вопрос в том, используете ли Вы try-catch в конструкторе?
я считаю это неправильным. в конструкторе никогда не пишу код, который может сгенерировать исключение. |
![]() |
Сообщ.
#2
,
|
|
Конструктор сам может генерировать исключение. Объект тогда не создается и память освобождается автоматически. Деструктор не должен кидать исключение. Против try\catch в конструкторе\деструкторе ничего не имею против.
|
Сообщ.
#3
,
|
|
|
Цитата niXman @ собственно вопрос в том, используете ли Вы try-catch в конструкторе? Редко. Обычно лучше пропустить исключение дальше. Цитата я считаю это неправильным. в конструкторе никогда не пишу код, который может сгенерировать исключение. А почему? |
![]() |
Сообщ.
#4
,
|
|
Цитата в конструкторе никогда не пишу код, который может сгенерировать исключение. Это нормальная практика, когда конструктор кидает исключение. Вместе с оператором new, который кидает исключение, это вполне оправдано |
Сообщ.
#5
,
|
|
|
Цитата D_KEY @ А почему? потому что, для подобных ситуаций, я считаю, правильней добавить метод init()(или как-то так) и уже его обернуть в try-catch |
Сообщ.
#6
,
|
|
|
Цитата niXman @ Цитата D_KEY @ А почему? потому что, для подобных ситуаций, я считаю, правильней добавить метод init()(или как-то так) и уже его обернуть в try-catch Так почему так правильней? Добавлено И я не понимаю почему ты говоришь о блоке try catch в конструкторе вместе с обсуждением выброса исключений из конструктора, хотя это взаимоисключающие, чаще всего, вещи. |
Сообщ.
#7
,
|
|
|
D_KEY
Считается что можно поиметь утечку ресурсов Например ![]() ![]() class CA { hfile * file; ... CA(char * filename) { file = OpenFile(filename); ... if(...) throw errcode; ... } } файл останется открытым. Варианты решения: вынести открытие файла из конструктора в Init; вынести код с throw в Init; оптимальный вариант - завернуть hfile в класс с закрытием файла в деструкторе( Если ООП так уж ООП во всём) niXman Считаю правильнее - это не аргумент, у каждого решения должно быть обоснование Какие риски при использовании try-catch в конструкторе? Я никаких рисков не вижу, вполне можно использовать. |
Сообщ.
#8
,
|
|
|
Цитата vnf @ вынести открытие файла из конструктора в Init; вынести код с throw в Init; Есть мнение, что это костыли, а не полноценные варианты. Цитата vnf @ оптимальный вариант - завернуть hfile в класс с закрытием файла в деструкторе( Если ООП так уж ООП во всём) Не столько ООП, сколько RAII. |
Сообщ.
#9
,
|
|
|
vnf, считаю, что ресурсов без владельцев быть вообше не должно. То есть всегда держаться RAII. И костыли в виде всяких init() будут не нужны.
|
![]() |
Сообщ.
#10
,
|
|
Цитата Считается что можно поиметь утечку ресурсов ... Вообще-то приведенный код может спровоцировать утечку ресурсов в любом месте, не только в конструкторе. Нужно контролировать и понимать что ты пишешь. И вариант решения - освобождать ресурс прежде чем бросить исключение. (в том числе использовать обертку, которая освобождает в деструкторе самостоятельно). |
Сообщ.
#11
,
|
|
|
поясню.
собственно спор возник из-за того, что коллега, в свойствах класса имеет вектор указателей которые инициализируются при помощи new. я ему сказал, чтоб в векторе хранил смарт-поинтеры, т.к. при инициализации этих самых объектов, есть большая вероятность что кто-то из них бросит исключение. что он сделал: в конструкторе, инициализацию этих самых указателей, обернул в try-catch, добавил метод clear(), который вызывает в catch и в деструкторе. это меня повергло в шок. собственно я, никогда в конструкторе не инициализирую то, что может бросить исключение. в худшем случае, инициализирую такие свойства в списке инициализаторов(если возможно). почему? - да хз... просто привычка. не могу вспомнить откуда... с какого-то форума. как найду ссылку на тему - скину. |
Сообщ.
#12
,
|
|
|
Цитата niXman @ собственно спор возник из-за того, что коллега, в свойствах класса имеет вектор указателей которые инициализируются при помощи new. я ему сказал, чтоб в векторе хранил смарт-поинтеры, т.к. при инициализации этих самых объектов, есть большая вероятность что кто-то из них бросит исключение. что он сделал: в конструкторе, инициализацию этих самых указателей, обернул в try-catch, добавил метод clear(), который вызывает в catch и в деструкторе. Тут ты прав. Цитата собственно я, никогда в конструкторе не инициализирую то, что может бросить исключение. в худшем случае, инициализирую такие свойства в списке инициализаторов(если возможно). почему? - да хз... просто привычка. не могу вспомнить откуда... с какого-то форума. как найду ссылку на тему - скину. А вот это уже непонятно и мало связано с описанным случаем. |
Сообщ.
#13
,
|
|
|
Цитата vnf @ Считается что можно поиметь утечку ресурсов Например ![]() ![]() class CA { hfile * file; ... CA(char * filename) { file = OpenFile(filename); ... if(...) throw errcode; ... } } файл останется открытым. При работе с неуправляемыми ресурсами try-catch можно использовать как раз с целью предотвращения утечек. ![]() ![]() class CA { public: CA(char const *filename) { file = OpenFile(filename); if (!file) throw FailedToOpenFile(filename); try { .... // код, потенциально генерирующий исключения } catch (...) { CloseFile(file); throw; } } .... private: hfile *file; }; Это, в общем-то, известная идиома. |
Сообщ.
#14
,
|
|
|
Цитата D_KEY @ А вот это уже непонятно и мало связано с описанным случаем. я никогда не допускаю в коде, ситуацию, двусмысленную/неопределенную. сейчас ссылку поищу... |
Сообщ.
#15
,
|
|
|
Цитата niXman @ Цитата D_KEY @ А вот это уже непонятно и мало связано с описанным случаем. я никогда не допускаю в коде, ситуацию, двусмысленную/неопределенную. сейчас ссылку поищу... А как с помощью исключений из конструктора можно допустить двусмысленную ситуацию? |