【发布时间】:2015-02-23 22:52:27
【问题描述】:
我无法理解std::async 怎么可能存储任何异常,而不仅仅是源自std::exception 的东西。我玩弄了下面的代码
#include <iostream>
#include <future>
#include <chrono>
void f()
{
std::cout << "\t\tIn f() we throw an exception" << std::endl;
throw 1; // throw an int
}
int main()
{
std::future<void> fut = std::async(std::launch::async, f);
std::cout << "Main thread sleeping 1s..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1)); // sleep one second
std::cout << "Main thread waking up" << std::endl;
try
{
fut.get();
}
catch(...)
{
std::cout << "We caught an exception!" << std::endl;
throw; // rethrow
}
}
我异步启动f(),然后在f 中抛出一个int。神奇的是,int 被std::async 返回的未来捕获并存储。我知道catch(...)std::async 中的异常是可能的,但是后者如何在不知道异常类型的情况下存储它呢?异常不是从某个基类派生的(在这种情况下,也许可以通过一些Base::clone“克隆”它),但可以是任何异常。我们能不能神奇地“推断”出异常类型?
总结一下,我的问题是:
我们如何在对象中存储任意异常,然后在不知道异常类型的情况下稍后重新抛出它?
【问题讨论】:
-
@BryanChen 谢谢,不知道这个,但我想问题仍然存在,
exception_ptr如何通过std::current_exception()推断类型?似乎std::current_exception负责“捕获”异常。 -
它不只是将其存储为std::type_info吗?
-
@Xiao 在运行时抛出异常,这本质上是我的问题,类型是如何“捕获”的?看起来在内部发生了类似于模板/自动类型推导的事情。
-
额外信息:
std::exception_ptr无法在可移植 C++ 中实现。它必须在同时实现异常抛出和捕获的“运行时库”中实现,并且编译器将创建对该库的调用(因此编译器和运行时库必须就私有 API 达成一致)。
标签: c++ exception c++11 asynchronous future