当前位置:  开发笔记 > 编程语言 > 正文

从通过std :: async启动的函数抛出的异常会发生什么

如何解决《从通过std::async启动的函数抛出的异常会发生什么》经验,为你挑选了1个好方法。

从通过启动的函数抛出的异常会发生什么std::async

#include 
#include 
#include 

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函数将这些异常捕获到函数外部?



1> Barry..:

从cppreference:

[...]如果该函数f返回一个值或抛出异常,它是存储在通过所述访问的共享状态std::futureasync返回给调用者.

并在参考中std::future::get():

如果异常存储在未来引用的共享状态中(例如通过调用std::promise::set_exception()),那么将抛出该异常.

所以,是的,如果你的函数抛出异常,那么该异常基本上会延迟到将来并重新开始get().

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有