На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> try-catch в конструкторе? оО
    собственно вопрос в том, используете ли Вы try-catch в конструкторе?
    я считаю это неправильным. в конструкторе никогда не пишу код, который может сгенерировать исключение.
      Конструктор сам может генерировать исключение. Объект тогда не создается и память освобождается автоматически. Деструктор не должен кидать исключение. Против try\catch в конструкторе\деструкторе ничего не имею против.
        Цитата niXman @
        собственно вопрос в том, используете ли Вы try-catch в конструкторе?

        Редко. Обычно лучше пропустить исключение дальше.

        Цитата
        я считаю это неправильным. в конструкторе никогда не пишу код, который может сгенерировать исключение.

        А почему?
          Цитата
          в конструкторе никогда не пишу код, который может сгенерировать исключение.

          Это нормальная практика, когда конструктор кидает исключение. Вместе с оператором new, который кидает исключение, это вполне оправдано
            Цитата D_KEY @
            А почему?

            потому что, для подобных ситуаций, я считаю, правильней добавить метод init()(или как-то так) и уже его обернуть в try-catch
              Цитата niXman @
              Цитата D_KEY @
              А почему?

              потому что, для подобных ситуаций, я считаю, правильней добавить метод init()(или как-то так) и уже его обернуть в try-catch

              Так почему так правильней?

              Добавлено
              И я не понимаю почему ты говоришь о блоке try catch в конструкторе вместе с обсуждением выброса исключений из конструктора, хотя это взаимоисключающие, чаще всего, вещи.
                D_KEY
                Считается что можно поиметь утечку ресурсов

                Например
                ExpandedWrap disabled
                  class CA
                  {
                    hfile * file;
                    ...
                    CA(char * filename)
                   {
                       file = OpenFile(filename);
                       ...
                       if(...) throw errcode;
                       ...
                    }
                  }

                файл останется открытым.

                Варианты решения:
                вынести открытие файла из конструктора в Init;
                вынести код с throw в Init;
                оптимальный вариант - завернуть hfile в класс с закрытием файла в деструкторе( Если ООП так уж ООП во всём)

                niXman
                Считаю правильнее - это не аргумент, у каждого решения должно быть обоснование

                Какие риски при использовании try-catch в конструкторе?
                Я никаких рисков не вижу, вполне можно использовать.
                Сообщение отредактировано: vnf -
                  Цитата vnf @
                  вынести открытие файла из конструктора в Init;
                  вынести код с throw в Init;

                  Есть мнение, что это костыли, а не полноценные варианты.
                  Цитата vnf @
                  оптимальный вариант - завернуть hfile в класс с закрытием файла в деструкторе( Если ООП так уж ООП во всём)

                  Не столько ООП, сколько RAII.
                    vnf, считаю, что ресурсов без владельцев быть вообше не должно. То есть всегда держаться RAII. И костыли в виде всяких init() будут не нужны.
                      Цитата
                      Считается что можно поиметь утечку ресурсов
                      ...

                      Вообще-то приведенный код может спровоцировать утечку ресурсов в любом месте, не только в конструкторе. Нужно контролировать и понимать что ты пишешь.
                      И вариант решения - освобождать ресурс прежде чем бросить исключение. (в том числе использовать обертку, которая освобождает в деструкторе самостоятельно).
                        поясню.
                        собственно спор возник из-за того, что коллега, в свойствах класса имеет вектор указателей которые инициализируются при помощи new. я ему сказал, чтоб в векторе хранил смарт-поинтеры, т.к. при инициализации этих самых объектов, есть большая вероятность что кто-то из них бросит исключение.
                        что он сделал:
                        в конструкторе, инициализацию этих самых указателей, обернул в try-catch, добавил метод clear(), который вызывает в catch и в деструкторе. это меня повергло в шок.
                        собственно я, никогда в конструкторе не инициализирую то, что может бросить исключение. в худшем случае, инициализирую такие свойства в списке инициализаторов(если возможно).
                        почему? - да хз... просто привычка. не могу вспомнить откуда... с какого-то форума. как найду ссылку на тему - скину.
                          Цитата niXman @
                          собственно спор возник из-за того, что коллега, в свойствах класса имеет вектор указателей которые инициализируются при помощи new. я ему сказал, чтоб в векторе хранил смарт-поинтеры, т.к. при инициализации этих самых объектов, есть большая вероятность что кто-то из них бросит исключение.
                          что он сделал:
                          в конструкторе, инициализацию этих самых указателей, обернул в try-catch, добавил метод clear(), который вызывает в catch и в деструкторе.

                          Тут ты прав.

                          Цитата
                          собственно я, никогда в конструкторе не инициализирую то, что может бросить исключение. в худшем случае, инициализирую такие свойства в списке инициализаторов(если возможно).
                          почему? - да хз... просто привычка. не могу вспомнить откуда... с какого-то форума. как найду ссылку на тему - скину.

                          А вот это уже непонятно и мало связано с описанным случаем.
                            Цитата vnf @
                            Считается что можно поиметь утечку ресурсов

                            Например
                            ExpandedWrap disabled
                              class CA
                              {
                                hfile * file;
                                ...
                                CA(char * filename)
                               {
                                   file = OpenFile(filename);
                                   ...
                                   if(...) throw errcode;
                                   ...
                                }
                              }

                            файл останется открытым.

                            При работе с неуправляемыми ресурсами try-catch можно использовать как раз с целью предотвращения утечек.

                            ExpandedWrap disabled
                              class CA
                              {
                              public:
                                  CA(char const *filename)
                                  {
                                      file = OpenFile(filename);
                                      if (!file)
                                          throw FailedToOpenFile(filename);
                                      try
                                      {
                                          .... // код, потенциально генерирующий исключения
                                      }
                                      catch (...)
                                      {
                                          CloseFile(file);
                                          throw;
                                      }
                                  }
                                  ....
                              private:
                                  hfile *file;
                              };

                            Это, в общем-то, известная идиома.
                            Сообщение отредактировано: Masterkent -
                              Цитата D_KEY @
                              А вот это уже непонятно и мало связано с описанным случаем.

                              я никогда не допускаю в коде, ситуацию, двусмысленную/неопределенную. сейчас ссылку поищу...
                                Цитата niXman @
                                Цитата D_KEY @
                                А вот это уже непонятно и мало связано с описанным случаем.

                                я никогда не допускаю в коде, ситуацию, двусмысленную/неопределенную. сейчас ссылку поищу...

                                А как с помощью исключений из конструктора можно допустить двусмысленную ситуацию?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0491 ]   [ 15 queries used ]   [ Generated: 16.06.25, 21:15 GMT ]