gpt4 book ai didi

c++ - 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:07 24 4
gpt4 key购买 nike

这是如何使用 std::exception_ptr 移动异常的最小代码示例:

#include <iostream>

#include <boost/thread.hpp>
#include <boost/optional.hpp>
#include <boost/variant.hpp>

int main() {
try
{
throw std::runtime_error("Error!");
}
catch (...)
{
boost::optional<boost::variant<int, std::exception_ptr>> v(std::move(std::current_exception()));
boost::promise<int> p;
boost::future<int> f = p.get_future();

try
{
std::rethrow_exception(std::move(boost::get<std::exception_ptr>(std::move(v.get()))));
}
catch (...)
{
p.set_exception(std::move(std::current_exception()));
}

try
{
f.get();
}
catch (const std::exception &e)
{
// This is what I would like to see:
std::cerr << "Error: " << e.what() << std::endl;
}
catch (...)
{
// This is what I get instead:
std::cerr << "Unknown error" << std::endl;
}
}

return 0;
}

我想保留实际对象 std::runtime_error 并将其抛出到最终的 f.get() 语句中。相反,我得到一个未知的异常,它不是从 std::exception 派生的。当我删除最后的 catch(...) 语句时,我得到以下输出:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<std::__exception_ptr::exception_ptr>'

我想避免任何克隆/复制操作。我想保留我的 std::runtime_error 实例并将其移动到最后(最后的 f.get() 调用)。如果有比 std::exception_ptr 更好的方法来存储任何异常,请告诉我,我会改用它。 Folly 使用类模板 folly::exception_wrapper 但我不知道任何其他标准类型。

您可以在这里查看原始项目的文件:https://github.com/tdauth/cpp-futures-promises/tree/master/src/advanced需要不同的重新抛出,因为我使用包装器类型 Try 和方法 Promise::tryComplete。

最佳答案

它似乎适用于 https://www.boost.org/doc/libs/1_68_0/libs/exception/doc/boost-exception.html

我不应该将 std::exception_ptr 与 Boost.Thread 一起使用。

此功能还有一个已关闭(不会修复)的工单:https://svn.boost.org/trac10/ticket/9710

这个问题是如何完成转换的:Converting std::exception_ptr to boost::exception_ptr

关于c++ - 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52043506/

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