Я шел через C++ FAQ 2nd Edition, FAQ 9.04- What is an exception specification?
,
Там упоминается, что если мы сгенерируем непредвиденное исключение из функции, чья сигнатура определяет набор предопределенных типов исключений, она должна вызвать unexpected()->terminate()->abort()
,
Но моя программа ловит неожиданное исключение и не abort()
И почему?
#include<iostream>
using namespace std;
class Type1{};
class Type2{};
class Type3{};
void func() throw(Type1, Type2)
{
throw Type3();
}
int main()
{
try{
func();
}
catch (Type1 &obj1)
{
cout << "Type1 is caught" << endl;
}
catch (Type2 &obj2)
{
cout << "Type2 is caught" << endl;
}
catch (Type3 &obj3)
{
cout << "Type3 is caught" << endl;
}
}
Здесь я получаю вывод Type3 is caught
что не должно было произойти.
IDE: VS2013
Из MSDN:
Спецификаторы исключений функций, кроме throw (), анализируются, но не используются. Это не соответствует разделу 15.4 спецификации ISO C ++
Visual C ++ просто не соответствует стандарту (цитата из стандарта в Ответ Мохита).
РЕДАКТИРОВАТЬ: о подвопросе «почему это не так?» Я пытаюсь обобщить из комментариев то, что было сказано.
Как сказал Адриано Репетти, MSVC, как известно, игнорирует спецификации исключений. Но для этого есть несколько причин.
это другой пост из SO объясняет, что спецификация исключений объясняет, что компилятор не может применять контроль исключений как время компиляции и должен генерировать код, чтобы просто управлять им во время выполнения. Вот почему он имеет плохую поддержку от компиляторов (особенно MSVC).
И это приводит очень подробную статью из GOTW, вывод которого таков:
Итак, вот что кажется лучшим советом, который мы, как сообщество, получили на сегодняшний день:
От except_spec
Если функция выдает исключение типа, не указанного в ее
В спецификации исключений вызывается функция std :: непредвиденный.
Похоже, что VS2013 не соответствует этому разделу.