исключение — ошибка перехвата c ++, вызванная PPL parallel_for

Я написал этот кусок кода, чтобы поймать ошибку, запущенную 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

Решение

Ваш синтаксис правильный, хотя нет причин, по которым вы не могли бы перехватить ссылку, чтобы избежать ненужного копирования объекта исключения:

 catch(const std::exception & error_)
  1. Убедитесь, что сгенерированное исключение происходит от std::exception,
  2. PPL будет разрешать распространение исключений только после завершения всех потоков. Может ли поток, который все еще работает, мешать вам увидеть исключение?

В целях отладки вы можете добавить дополнительный блок catch:

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

Просто чтобы проверить, не выдается ли какое-либо исключение, однако я бы не оставил это в рабочем коде, потому что нет никакого способа сделать что-либо с этим исключением.

3

Другие решения

Во-первых, проверьте, что бросили. Если вы неправильно напечатаете улов, он не будет реагировать. Может быть, это просто маркер CONST? const-type отличается от non-const-type, но на самом деле я не очень хорошо помню, являются ли уловки чувствительными к const-volatile.

Во-вторых, если нет веских причин, всегда ловите по ссылке:

catch(std::exception& error)

Если вы этого не сделаете, то произойдет копирование исключения: http://www.parashift.com/c++-faq/what-to-catch.html Под копированием я подразумеваю копирование объектов, а не повторное поднятие;)

0

По вопросам рекламы [email protected]