Concurrency Runtime检测到任务抛出的异常无法处理并且“快速失败”;也就是说,它终止了这个过程。我有一个案例,给when_all
的多个子任务可能会抛出异常。理想情况下,我希望这些异常取消任务树,然后在顶级get或wait中引发的单个异常中进行聚合。相反,我的流程终止于我之下。这是一个演示问题的玩具示例:
#include <tchar.h>
#include <ppltasks.h>
#include <iostream>
#include <vector>
concurrency::task<int> CreateTask(int i)
{
return concurrency::create_task([i]()
{
throw std::runtime_error("boo");
return i;
});
}
void Go()
{
std::vector<concurrency::task<int>> tasks;
tasks.push_back(CreateTask(1));
tasks.push_back(CreateTask(2));
auto allDone = concurrency::when_all(tasks.begin(), tasks.end());
try
{
allDone.get();
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
}
catch (...)
{
std::cout << "Unexpected exception." << std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Go();
std::cout << "Process is still running." << std::endl;
return 0;
}
在此示例中,在“Process仍在运行”之前终止进程,并将其打印到控制台。似乎子任务中的异常导致wait_all
立即调用其继续,而不等待其他子任务完成/取消,然后由其他子任务引发的异常无法处理并导致终止的过程。这似乎非常不受欢迎。有解决方法吗?这是一个错误吗?我错过了什么吗?