Что делает спецификация noexcept? Я думал, что она не позволит функции кинуть исключение, но это не так, функция:
int Foo() noexcept
{
throw std::runtime_error("error");
return 0;
}
компилируется, её вызов спокойно падает, значит исключение вылетело. noexcept ничего не изменил.
Спецификатор noexcept
дает гарантию времени компиляции, что из функции не будет выброшено исключение. Однако такая гарантия достигается эквивалентно оборачиванию тела функции в блок try...catch с вызовом ::std::terminate
:
int Foo() noexcept
{
try
{
throw std::runtime_error("error");
}
catch(...)
{
::std::terminate();
}
}
Определить, что в теле функции исключений действительно не выбрасывается и соптимизировать их перехват компиляторы могут только в самых простых случаях. Идея была в том, что оптимизацию сможет осуществить вызывающий код. Но на практике это все не работает и контроля над исключениями во время компиляции, особенно после выкидывания спецификаторов исключений, в с++ фактически нет.
Этим вы как автор гарантируете, что ваша функция не генерирует исключений, так что компилятор может, полагаясь на это, выполнять ряд оптимизаций.
Понятно, что вы хозяин своему слову - сам дал, сам и назад забрал! Только потом не удивляйтесь результатам - завершению программы.
См., например, эту статейку.
Отправляю запрос, в переменной data содержится результат вызова метода photossaveWallPhoto, ошибок нет