Спецификация исключений в 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

Другие вопросы по тегам