Нет ограничений на типы исключений броска

Я узнал, что когда я указываю тип исключения, которое может генерировать функция, другие не могут быть выброшены, но когда я тестировал этот код, он не следовал этому правилу.

void foo(int i)throw(int)
{
    if(i==2)
    {
        throw("exception");
    }
}
int main()
{
    int i=2;
    try
    {
        foo(i);
    }
    catch(const char* ex)
    {
        cout<<ex<<endl;
    }
    return 0;
}

Я что-то не так понял?

1 ответ

Решение

Спецификации исключений работают не так, как вы думали.

Вы по-прежнему можете выбросить любое исключение, но если вы на самом деле позволите чему-либо, не указанному в списке, скрыться, вы получите unexpected() а также terminate(),

Это распространенная ошибка - думать, что спецификация исключения похожа на Java, но это не так. Большинство рекомендаций гласит, что не следует их использовать, возможно, за исключением throw(). Некоторые компиляторы указаны как не реализующие их (проверьте MSVC dox, если вы используете этот). Они устарели в текущем стандарте (C++11). __noexcept(true/false) продвигает разумный вариант использования.

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