You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
template<typename T, typename Less>
boolFindMaxEx(std::vector<T>const & arr, T & maxValue, Less const & less)
{
if (arr.empty())
{
returnfalse;
}
const T maxValueBackup = maxValue;
try
{
const T* lastMax = &arr.front();
for (size_t i = 0; i < arr.size(); ++i)
{
if (less(*lastMax, arr[i]))
{
lastMax = &arr[i];
}
}
maxValue = *lastMax;
}
catch (const std::exception& ex)
{
maxValue = maxValueBackup;
throw ex;
}
returntrue;
}
При присваивании указателей исключения не выбрасываются.
Строгую гарантию исключений обеспечить, предполагая, что оператор присваивания типа T обеспечивает строгую гарантию безопасности исключений, а операция сравнения обеспечивает либо гарантию отсутствия исключений, либо строгую гарантию безопасности, не изменяя сравниваемых значений даже при выбрасывании исключений.
Способ, которым вы бросаете пойманное исключений, приведет к тому, что вызывающий код поймает не оригинальный объект исключения, а его лишь часть, которую вы поймали. Для перевыброса исключения следует использоват несколько иной синтаксис оператор throw. В лекции все есть.
Нельзя полагаться на то, что операция, выбросившая в блоке try исключение, не выбросит его в блоке catch
Код может выбросить исключение, не являющееся наследником std::exception. В этом случае в ваш обработчик управление не будет передано
Задачу можно решить, не используя try/catch
Сделать одну версию функции FindMaxEx, которую можно было бы вызывать как с явным указанием операции сравнения, так и без указания оной. Во втором случае должна по умолчанию использоваться операция сравнения <
При присваивании указателей исключения не выбрасываются.
Строгую гарантию исключений обеспечить, предполагая, что оператор присваивания типа T обеспечивает строгую гарантию безопасности исключений, а операция сравнения обеспечивает либо гарантию отсутствия исключений, либо строгую гарантию безопасности, не изменяя сравниваемых значений даже при выбрасывании исключений.
Способ, которым вы бросаете пойманное исключений, приведет к тому, что вызывающий код поймает не оригинальный объект исключения, а его лишь часть, которую вы поймали. Для перевыброса исключения следует использоват несколько иной синтаксис оператор throw. В лекции все есть.
Нельзя полагаться на то, что операция, выбросившая в блоке try исключение, не выбросит его в блоке catch
Код может выбросить исключение, не являющееся наследником std::exception. В этом случае в ваш обработчик управление не будет передано
Задачу можно решить, не используя try/catch
Сделать одну версию функции FindMaxEx, которую можно было бы вызывать как с явным указанием операции сравнения, так и без указания оной. Во втором случае должна по умолчанию использоваться операция сравнения <