2

Я использую VC2010 и пишу следующий код для проверки функции «set_unexpected»."set_unexpected" не работает в VC2010?

#include <iostream> 
#include <exception> 

void my_unexpected_handler() 
{ 
    std::cout << "unexpected handler" << std::endl; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    set_unexpected(my_unexpected_handler); 

    throw 1; 

    return 0; 
} 

Однако «my_unexpected_handler» никогда не вызывается (строка не печатается на консоли, я попытался установить точку останова в my_unexpected_handler, не впадать в).

Что случилось с моим кодом?

Благодаря


К сожалению, я не понял неожиданное исключение. Однако, даже если я изменю код на следующий

#include <iostream> 
#include <exception> 

void my_unexpected_handler() 
{ 
    std::cout << "unexpected handler" << std::endl; 
} 

void func() throw(int) 
{ 
    throw 'h'; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::set_unexpected(my_unexpected_handler); 

    func(); 

    return 0; 
} 

Он все еще не работает? То есть, «my_unexpected_handler» не вызывается.

+0

Этот код не должен даже компилировать. Вам нужно квалифицировать 'set_unexpected' с помощью' std :: '. Отправьте фактический код. Кроме того, вы, вероятно, ищете 'set_terminate', если вы находитесь в' main'. – dirkgently

+1

Обратите внимание на предупреждения: 'предупреждение C4290: спецификация исключений в C++ игнорируется, кроме как для указания функции не __declspec (nothrow)' –

ответ

1

Поскольку функция, выбрасывающая исключение, не имеет спецификации , ожидается исключение. Неожиданный обработчик исключений, достаточно логически, обрабатывает только unexpected exceptions. Ничто не делает это исключение неожиданным.

3

Возможно, вы ничего не сделали. Вы используете visual studio 2010 и этот компилятор не поддерживает спецификации исключений. Ну, он будет использовать код проверки синтаксиса, но не проверяет исключение в runtime.

см http://msdn.microsoft.com/en-us/library/wfa0edys(v=vs.100).aspx

Это не считается проблемой, как исключения спецификации, как правило, не считаются полезными, и есть на самом деле были устаревшими в то C++ 11 стандарт