В общем наткнулся на такую интересную проблемку при работе с исключениями, вот мой код: #include <iostream> #include <exception> #include <stdexcept> class Exception : public std::exception { public: Exception() throw() {} explicit Exception(const std::string &m) throw() : exception() { mess_ = m; } ~Exception() throw() {} const char* what() const throw() { return mess_.c_str(); } private: std::string mess_; }; class LogicException : public std::logic_error { public: explicit LogicException(const std::string &m) throw() : std::logic_error(m) {} ~LogicException() throw() {} }; class RealyBadException {}; void f() throw(Exception, std::bad_exception) { //throw Exception("Exception from f()"); //случай f1 //throw LogicException("LogicException grom f()"); //случай f2 //throw RealyBadException(); //случай f3 } int main() { try { f(); } catch (std::bad_exception const& ex) { std::cout << "std::bad_exception" << std::endl; } catch (std::exception const& ex) { std::cout << ex.what() << std::endl; } catch (...) { std::cout << "Something realy odd" << std::endl; } } Так вот, суть проблемы вот в чем согласно книжке Б.Страуструпа по С++ если я нарушаю спецификацию исключений ф-ии ( в функции void f() throw(Exception) сгенерю исключение RealyBadException или LogicException) то вызывается ф-ия unexpected(),а затем terminate() что приводит к остановке программы. Если я добавлю к спецификации исключений std::bad_exception, то в точке вызова появится возможность перехватить исключение std::bad_exception - это в теории. Что же происходит на практике. 1) Если раскоментировать "случай f1", то все идет как и должно быть, исключение ловится во втором болке catch ф-ии main() 2) Если раскоментировать "случай f2" тогда в окне терминала я получаю следующее сообщение: terminate called after throwing an instance of 'LogicException' what(): LogicException grom f() Aborted 3) И в последнем случае f3 я получаю terminate called after throwing an instance of 'RealyBadException' Aborted хотя последние 2 случая должны ловица в первом блоке catch ф-ии main(). Кто сможет растолковать почему программа аварийно завершается вместо того чтобы обработать исключение.
Ответ на:
комментарий
от int19h
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Исключения в С++ (2010)
- Форум Множественное наследование и try/catch inderect base, C++ (2008)
- Форум Валится на throw (2005)
- Форум Как правильно наследовать от std::exception ? (2007)
- Форум Не работает многопоточность на с++11 (2014)
- Форум C++/exceptions - деление на ноль не ловиццо, почему? (2006)
- Форум Не работает многопоточность на с++11 (2014)
- Форум Багофича эксепшенов с++ ? (2013)
- Форум Продолжим про исключения!! (2007)
- Форум [C++] [Жаба] Это магия? (2008)