Спецификация исключений в C++ - обработка недопустимых исключений
Каково стандартное поведение в случаях, когда функция выдает исключение, отсутствующее в допустимом списке исключений? Например, когда я запускаю этот код:
#include <iostream>
#include <cstdlib>
using namespace std;
void NotLegal() throw(char) {
throw 42;
}
void myunexpected () {
cout << "exception not in list\n";
cin.get();
exit(0);
}
int main()
{
set_unexpected(myunexpected);
try {
NotLegal();
}
catch(...) {
cout << "exception catched";
cin.get();
}
return 0;
}
Он ведет себя по-разному на компиляторах GCC и Visual Studio C++:
- На VS 2010 непредвиденное исключение отлавливается в общем обработчике исключений.
- На GCC
unexpected()
Функция-обработчик вызывается вместо перехвата исключения.
Почему эта разница? Почему компилятор MS C++ не вызывает unexpected()
Перезвоните?
2 ответа
Решение
Документация для set_unexpected
вызывает это поведение:
замечания
...
Стандарт C++ требует, чтобы
unexpected
вызывается, когда функция генерирует исключение, которого нет в ее списке. Текущая реализация не поддерживает это.
Вы собрали с правильными флагами? В Visual Studio по умолчанию не включена обработка исключений для некоторых оптимизированных сборок выпуска.
Вы хотите / с и /EHsc