Re[3]: Эксепшн из деструктора
От: Cyberax Марс  
Дата: 25.11.11 09:31
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>По правилам C++11 с учётом их планируемой корректировки (см. ниже) попытка выкинуть исключение из такого деструктора должна привести к вызову std::terminate. Дело в том, что отсутствие явного указания exception-specification в данном случае равноценно указанию noexcept(true), т.е. такой деструктор обязуется не бросать исключения. Чтобы разрешить ему бросать исключения, нужно указать соответствующую exception-specification.

Блин, они не могут угомониться с этими исключениями. Хотя, конечно, noexcept добавить несложно.
Sapienti sat!
Re[2]: Эксепшн из деструктора
От: Тот кто сидит в пруду Россия  
Дата: 25.11.11 10:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

А>>Недавно на собеседовании спросили, почему нельзя кидать исключение из деструктора. А, собственно, почему? Накидал в 2005-й студии тестовый код, вроде все нормально отработало.

C>Вполне можно, более того, иногда полезно.

C>У меня вот так сделана обработка исключений:

C>
C>    /**
C>      Usage - err(sOk) << "This is a description"
C>      */
C>    struct err : public std::stringstream
C>    {
C>        err(result_code_t::code_e code) : code_(code) {}
C>        ~err()
C>        {
C>            //Yes, we're throwing from a destructor
C>            if (code_!=result_code_t::sOk)
C>            {
C>                boost::throw_exception(my_exception(result_code_t(code_, str())));
C>            }
C>        }

C>    private:
C>        result_code_t::code_e code_;
C>    };

C>    /**
C>      Usage: some_function(...) | die;
C>      */     
C>    inline void operator | (const result_code_t &code, const die_t &)
C>    {
C>        if (!code.ok())
C>            boost::throw_exception(my_exception(code));
C>    }
C>


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


Ха, я примерно такую же фигню залудить хотел, но чето взяли меня сомнения, не будет ли при таком использовании теряться содержимое stringstream. А выяснять поленился.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Эксепшн из деструктора
От: alexeiz  
Дата: 26.11.11 05:45
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>У меня вот так сделана обработка исключений:


die — хорошая идея. У меня тоже такое было пока я работал с функциями возвращающими коды ошибок. А вот err — не очень. Создание временного stringstream и форматирование сообщения об ошибке происходит вне зависимости от того, произошла ошибка или нет.
Re[3]: Эксепшн из деструктора
От: Cyberax Марс  
Дата: 26.11.11 19:52
Оценка:
Здравствуйте, alexeiz, Вы писали:

C>>У меня вот так сделана обработка исключений:

A>die — хорошая идея. У меня тоже такое было пока я работал с функциями возвращающими коды ошибок. А вот err — не очень. Создание временного stringstream и форматирование сообщения об ошибке происходит вне зависимости от того, произошла ошибка или нет.
Оно у меня обычно используется так:
if (some_bad_condition())
   err(badConditionCode) << "Something bad!";


Если что, можно сделать макрос:
#define ERR(scode) if (!is_success(scode)) err(scode)

...
ERR(code_failed) << "Something bad";
Sapienti sat!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.