Ну, причина того, что обработчик исключений
catch(int i) /*this catch statement must be ignored then,but it is running*/
{
cout<<"caught an integer"; /*this is the output on the screen*/
}
выполняется вместо неожиданного вызываемого обработчика, вероятно, лежит на вашем компиляторе.
Стандартное поведение соответствия, когда исключение выдаетсяфункция со спецификацией исключения, но тип брошенного исключения не соответствует спецификации исключения, будет то, что неожиданный обработчик будет вызван.Обработчик по умолчанию завершает программу.
В действительности многие компиляторы игнорируют спецификации исключений, а некоторые могут просто выдавать некоторые предупреждения, сообщающие вам об этом.То, что компиляторы их игнорируют, - хорошая идея imho.
Спецификация исключений в C ++ работает не так, как вы бы этого хотели.Спецификация исключений не означает, что компилятор гарантирует, что функция не может генерировать любые другие исключения, кроме тех, которые упомянуты в спецификации исключений.В стандартном компиляторе соответствия это просто означает, что компилятор должен применять спецификацию исключений во время выполнения (если выбрасываемое исключение соответствует спецификации исключения, у вас все хорошо, если нет, вы должны оказаться в неожиданном обработчике)
Для получения дополнительной информации о спецификациях исключений и о том, почему их следует избегать, см. здесь (Херб Саттер объясняет там, в основном, что спецификации исключений в C ++ не такие, какими они должны быть / большинство людей думают, что они есть).И вы получите дополнительные ссылки внизу страницы ...