gpt4 book ai didi

c++ - 使用 boost::future/boost::promise 无法跨线程正确传播异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:52 25 4
gpt4 key购买 nike

我简化了以下代码:

线程二:

  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 异常或其派生异常之一从线程二传播到线程一:

terminate called after throwing an instance of '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: error: no matching function for call to 'std::runtime_error::runtime_error()'

只要返回一个 bool 值,我就可以让代码毫无异常(exception)地正常工作,但这是一种折衷。

最佳答案

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

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

否则,如果您想让 current_exception() 正常工作,您必须处理以下问题:

throw boost::enable_current_exception(cfg::ConfigError("meh")); 

关于c++ - 使用 boost::future/boost::promise 无法跨线程正确传播异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13226589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com