У меня есть следующий код, который я упростил:
Нить вторая:
boost::unique_future<void> future;
TaskPtr task(new task::ReloadConfig(future));
Listener::PushTask(task);
future.wait();
try
{
future.get();
}
catch (const cfg::ConfigError& e)
{
return cmd::Result::Okay;
}
Нить вторая:
try
{
cfg::UpdateShared(std::shared_ptr<cfg::Config>(new cfg::Config(configFile)));
}
catch (...) // should be cfg::ConfigError
{
promise.set_exception(boost::current_exception());
return;
}
promise.set_value();
Вместо исключения Cfg :: ConfigError или одного из его производных исключений, распространяемых из потока два в поток один, я получаю следующее:
завершить вызов после броска экземпляра
‘Повышение :: exception_detail :: clone_impl’
что (): std :: исключение
Кажется, у этого другого человека были подобные проблемы и нет ответа:
Я также получаю следующую ошибку, если я пытаюсь использовать boost :: enable_current_exception:
/usr/local/include/boost/exception/exception.hpp:419:20: ошибка: нет
функция соответствия для вызова ‘std :: runtime_error :: runtime_error ()’
Я могу заставить код работать без исключений, просто возвращая логическое значение, но это компромисс.
Я бы попытался сделать что-то подобное в вашей теме два:
catch (const cfg::ConfigError& e)
{
promise.set_exception(boost::make_exception_ptr(e));
}
В противном случае, если вы хотите этого current_exception()
чтобы работать, надо возиться с такими вещами, как:
throw boost::enable_current_exception(cfg::ConfigError("meh"));
Других решений пока нет …