pPL parallel_for引发的c ++ catch错误

时间:2012-10-02 12:33:59

标签: c++ exception parallel-processing try-catch ppl

我已经编写了这段代码来捕获ppl发布的错误

    try
    {
        parallel_for (m_row_start, m_row_end + 1, [&functionEvaluation,varModel_,this](int i)
        {
             // do things
        });
    }
    catch(const std::exception error_)
    {
        QString t(error_.what());
    }



    try
    {
        return functionEvaluation.combine(plus<double>());
    }
    catch(const std::exception error_)
    {
        QString t(error_.what());
    }

虽然我强烈怀疑它确实引发了异常(但try{}catch(...){}抓住了std::exception而没有明确的消息,但没有发现任何错误。

我正确的用于捕获ppl代码中引发的异常的语法?

2 个答案:

答案 0 :(得分:3)

您的语法是正确的,尽管您没有理由不能通过引用捕获以避免不必要的异常对象复制:

 catch(const std::exception & error_)
  1. 检查实际抛出的异常是否来自std::exception
  2. PPL只允许异常在所有线程完成后传播,你是否有一个仍在运行的线程阻止你看到异常?
  3. 出于调试目的,您可以添加额外的catch块:

    catch(...)
    {
      cout << "Unknown exception" << endl;
    }
    

    只是为了检查你是否收到任何类型的异常,但我不会将其留在生产代码中,因为没有办法对异常做任何有用的事情。

答案 1 :(得分:0)

首先,检查抛出的内容。如果您输入错误,它将不会做出反应。也许它只是CONST标记? const-type与非const-type不同,但实际上我不记得catch是const-volatile敏感的。

其次,除非出现强烈的理由,否则始终以引用方式引用:

catch(std::exception& error)

如果不这样做,则会发生异常复制:http://www.parashift.com/c++-faq/what-to-catch.html通过复制我的意思是对象复制,而不是重新提升;)