Метод set_exception
Метод set_exception класса promise
сохраняет исключение в общем состоянии. Это исключение
будет выброшено в потоке, который вызовет метод
get у связанного объекта future.
В первый параметр мы передаем объект исключения
std::exception_ptr, который можно получить
с помощью функции std::current_exception
или std::make_exception_ptr. Метод не принимает
других параметров и возвращает void.
После вызова set_exception объект promise
считается выполненным. Повторный вызов set_exception
или set_value приведет к выбросу исключения
std::future_error с кодом
std::future_errc::promise_already_satisfied.
Синтаксис
promise.set_exception(exception_ptr)
Пример
Давайте создадим promise, сохраним в него
исключение и получим его через future:
#include <iostream>
#include <future>
#include <stdexcept>
using namespace std;
int main()
{
promise<int> prom;
future<int> fut = prom.get_future();
try
{
throw runtime_error("something went wrong");
}
catch (...)
{
prom.set_exception(current_exception());
}
try
{
cout << fut.get() << endl;
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
Результат выполнения кода:
"something went wrong"
Пример
Давайте сохраним исключение с помощью
make_exception_ptr без использования
блока try-catch:
#include <iostream>
#include <future>
#include <stdexcept>
using namespace std;
int main()
{
promise<int> prom;
future<int> fut = prom.get_future();
prom.set_exception(
make_exception_ptr(logic_error("invalid state"))
);
try
{
cout << fut.get() << endl;
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
Результат выполнения кода:
"invalid state"
Смотрите также
-
метод
set_value,
который сохраняет значение в общем состоянии -
метод
get_future,
который возвращает связанный объект future -
класс
promise,
который предоставляет механизм отложенного результата -
метод
getкласса future,
который возвращает результат или выбрасывает исключение