由 PPL parallel_for引发的 C++ 捕获错误



我写了这段代码来捕捉 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 代码中提出的异常的语法是正确的吗?

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

 catch(const std::exception & error_)
  1. 检查引发的异常是否确实派生自 std::exception
  2. PPL 只允许在所有线程完成后传播异常,您是否可以有一个仍在运行的线程阻止您看到异常?

出于调试目的,您可以添加一个额外的 catch 块:

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

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

首先,检查抛出的内容。如果您输入错误,它将不会做出反应。也许它只是 CONST 标记?常量型与非常量型不同,但我实际上记不太清楚渔获物是否对常量挥发性敏感。

其次,除非有充分的理由出现,否则请始终通过参考来捕获:

catch(std::exception& error)

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

最新更新