Здравствуйте, 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, 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";