【发布时间】:2021-11-28 07:39:19
【问题描述】:
使用具有类似方法的库:
std::future<bool> action();
我发现自己必须遵守项目特定的enum 返回类型,例如:
enum Result { Ok, Failed, ConnectionDown, ServerError };
并且调用的动作点如下所示:
std::future<Result> act()
{
try {
return _actor->action(); // This returns a different type :(
// What to do here ??? ^
}
catch (ConnectionError const& e)
{
return std::make_ready_future<Result>(Result::ConnectionError);
}
catch (ServerError const& e)
{
return std::make_ready_future<Result>(Result::ServerError);
}
}
所以本质上,该库没有针对错误情况的特定返回码,而是将它们作为异常发出。处理这很容易,因为我可以构建具有适当价值的现成期货。问题(具有讽刺意味)在于非异常路径,其中库的 std::future<bool> 必须转换为 std::future<Result>。
.get() 结果并根据其值(true -> Ok, false -> Failed)构建一个就绪的未来是没有意义的,因为这样我就可以从我的函数中删除异步性。有没有更好的方法来处理这个问题?
【问题讨论】:
-
函数返回后是否会引发异常?我的意思是如果返回
future时该值还不可用。如果是这种情况,catch 块就会错过它。
标签: c++ multithreading c++17