В общем наткнулся на такую интересную проблемку при работе с исключениями, вот мой код:
#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)