2

我简化了以下代码:

线程二:

  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的实例后调用终止

似乎这个其他人有类似的麻烦,没有答案:

https://stackoverflow.com/questions/10857834/how-to-use-boostfuture-get-to-get-user-defined-exception

如果我尝试使用 boost::enable_current_exception,我也会收到以下错误:

/usr/local/include/boost/exception/exception.hpp:419:20: 错误:没有匹配函数调用'std::runtime_error::runtime_error()'

通过只返回一个布尔值,我可以让代码正常工作,没有例外,但这是一种妥协。

4

1 回答 1

0

我会尝试在你的线程二中做类似的事情:

catch (const cfg::ConfigError& e)
{
    promise.set_exception(boost::make_exception_ptr(e));
}

否则,如果你想让它current_exception()工作,你必须搞砸以下事情:

throw boost::enable_current_exception(cfg::ConfigError("meh")); 
于 2012-11-05T06:15:02.743 回答