1

Каково стандартное поведение в случаях, когда функция исключает исключение из списка исключенных исключений? Например, когда я запускаю этот код:Спецификация исключений в 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()?

+1

Вы пытались изменить свой пример? Просто убедитесь, что вы не получите автоматического преобразования между 42 и символом. Просто попробуйте throw() вместо throw (char). –

+0

это то же самое с пустым списком исключений. –

ответ

3

The documentation для set_unexpected взывает такое поведение:

Замечание

...

Стандарта C++ требует, чтобы unexpected вызывается, когда функция вызывает исключение, которое не входит в его список бросков. Текущая реализация не поддерживает это.

1

Скомпилированы ли вы с помощью правильных флагов? Visual Studio по умолчанию не включает обработку исключений для некоторых оптимизированных версий релизов.

Вы хотите /c and /EHsc

+3

Документация, с которой вы связываетесь, говорит * Стандарт C++ требует, чтобы неожиданное вызывалось, когда функция выдает исключение, которое не находится в его списке бросков. ** Текущая реализация не поддерживает это **. * –

+0

Я также подозреваю, что VS C++ не реализовал это. Не могли бы вы написать это как отдельный ответ? –

 Смежные вопросы

  • Нет связанных вопросов^_^