2

我编写了这段代码来捕获 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 代码中引发的异常的语法是否正确?

4

2 回答 2

3

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

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

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

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

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

于 2012-10-02T12:38:07.993 回答
0

首先,检查抛出的内容。如果你打错了catch,它不会反应。也许它只是 CONST 标记?const-type 与 non-const-type 不同,但实际上我不太记得 catch 是否对 const-volatile 敏感。

其次,除非出现强有力的理由,否则总是通过引用来捕捉:

catch(std::exception& error)

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

于 2012-10-02T12:38:19.033 回答