V759. Violated the order of exception handlers. Exception caught handler for the base class.


Анализатор обнаружил множественные обработчики исключений с нарушенным порядком следования. Обработчик для базового класса исключений, размещен перед обработчиком для производного класса. В таком случае, все исключения, предназначенные для перехвата обработчиком производного класса, будут перехвачены обработчиком для базового класса.

Рассмотрим пример:

class Exception { .... };
class DerivedException : public Exception { ... };
void foo()
{
  throw DerivedException;
}
void bar()
{
  try
  {
    foo();
  }
  catch (Exception&)
  {
    // Все исключения, имеющие тип DerivedException попадут сюда
  }
  catch (DerivedException&)
  {
    // Код в этом обработчике никогда не выполняется
  }
}

Так как класс 'Exception' является базовым, для класса 'DerivedException', исключения, которые генерирует функция 'foo()' перехватываются первым обработчиком.

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

void bar()
{
  try
  {
    foo();
  }
  catch (DerivedException&)
  {
    // Перехватывает исключения типа DerivedException
  }
  catch (Exception&)
  {
    // Перехватывает исключения типа Exception
  }
}

Теперь каждый обработчик, перехватывает исключения, предназначенные только для него.

Согласно Common Weakness Enumeration, потенциальные ошибки, найденные с помощью этой диагностики, классифицируются как CWE-703.


Найденные ошибки

Проверено проектов
354
Собрано ошибок
13 290

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;