2.3.2 异常处理
当一个并行循环中抛出未处理异常时,就不会再执行新的步骤了。但在默认情况下,异常抛出时正在运行的其他迭代操作仍将继续。一直到它们全部完成之后,该并行循环才会将异常上抛到调用它的线程中去。
抛出一个未处理异常可以阻止新的迭代操作开始。
由于循环运行在并行环境中,所以可能会发生不止一个异常。如果遇上这种情况,并行循环会随机抛出一个异常,而剩下的异常将不会被外界所察觉注6。
下面的代码示范了如何在并行循环中执行异常处理操作。
- vector<double> results = ...
- try
- {
- size_t n = results.size();
- parallel_for(0u, n, [&results](size_t i)
- {
- results[i] = DoWork(i, 10); // throws exception
- });
- }
- catch (ParallelForExampleException e)
- {
- printf("Exception caught as expected.\n");
- }