我简化了以下代码:
线程二:
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 异常或其派生异常之一从线程二传播到线程一:
在抛出 'boost::exception_detail::clone_impl'
what(): std::exception的实例后调用终止
似乎这个其他人有类似的麻烦,没有答案:
如果我尝试使用 boost::enable_current_exception,我也会收到以下错误:
/usr/local/include/boost/exception/exception.hpp:419:20: 错误:没有匹配函数调用'std::runtime_error::runtime_error()'
通过只返回一个布尔值,我可以让代码正常工作,没有例外,但这是一种妥协。