我写了这段代码来捕捉 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_)
- 检查引发的异常是否确实派生自
std::exception
。 - PPL 只允许在所有线程完成后传播异常,您是否可以有一个仍在运行的线程阻止您看到异常?
出于调试目的,您可以添加一个额外的 catch 块:
catch(...)
{
cout << "Unknown exception" << endl;
}
只是为了检查您是否抛出任何类型的异常,但是我不会将它留在生产代码中,因为没有办法对异常做任何事情。
首先,检查抛出的内容。如果您输入错误,它将不会做出反应。也许它只是 CONST 标记?常量型与非常量型不同,但我实际上记不太清楚渔获物是否对常量挥发性敏感。
其次,除非有充分的理由出现,否则请始终通过参考来捕获:
catch(std::exception& error)
如果不这样做,则会发生异常复制:http://www.parashift.com/c++-faq/what-to-catch.html 我所说的复制是指对象复制,而不是重新提出;