通过 std::async 启动的函数引发的异常会发生什么情况
What happens to exceptions thrown from functions launched via std::async
通过std::async
启动的函数引发的异常会发生什么情况?
#include <future>
#include <iostream>
#include <stdexcept>
void foo()
{
std::cout << "foo()" << std::endl;
throw std::runtime_error("Error");
}
int main()
{
try
{
std::cout << "1" << std::endl;
auto f = std::async(std::launch::async, foo);
f.get();
std::cout << "2" << std::endl;
}
catch (const std::exception& ex)
{
std::cerr << ex.what() << std::endl;
}
}
MSVC 为我提供了以下输出:
1
foo()
Error
通过调用 get
函数在函数外部捕获此类异常是否正确?
来自 cpp首选项:
[...]如果函数
f
返回一个值或抛出一个异常,它将存储在共享状态中,可通过async
返回给调用方的std::future
访问。
在关于std::future::get()
的参考资料中:
如果异常存储在将来引用的共享状态中(例如,通过调用
std::promise::set_exception()
),则将抛出该异常。
所以是的,如果你的函数抛出一个异常,该异常基本上会推迟到将来并在get()
重新抛出。
相关文章:
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 发生注入类名时会发生什么情况?(C++)
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 重新分配向量时,向量中的内存会发生什么情况
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 使用 Google 基准测试时返回值会发生什么情况?
- 正在连接的等待条件变量的线程会发生什么情况?
- 如果未定义的C++行为符合 C 定义的行为,会发生什么情况?
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- 如果字符串在 C/C++ 中没有 NUL 字符(以防编译器允许它通过)会发生什么情况?
- 将虚拟方法定义为私有方法时会发生什么情况?
- 如果从在其他函数中调用的函数引发异常会发生什么情况
- 通过 std::async 启动的函数引发的异常会发生什么情况
- 在什么情况下,if语句可以抛出异常