当`when_all`的多个子任务抛出未捕获的异常时,是否可以阻止进程终止?

时间:2013-11-20 14:54:58

标签: c++ visual-studio-2013 ppl concurrency-runtime

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立即调用其继续,而不等待其他子任务完成/取消,然后由其他子任务引发的异常无法处理并导致终止的过程。这似乎非常不受欢迎。有解决方法吗?这是一个错误吗?我错过了什么吗?

0 个答案:

没有答案