# V2010. Handling of two different exception types is identical.

Данное диагностическое правило добавлено по просьбе пользователей.

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

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

    try
    {
      ....
    }
    catch (AllocationError &e)
    {
      WriteLog("Memory Allocation Error");
      return false;
    }
    catch (IOError &e)
    {
      WriteLog("Memory Allocation Error");
      return false;
    }

Код писался с помощью Copy-Paste и поэтому при ошибке чтения из файла, в лог запишется неверное сообщение. На самом деле, код должен был выглядеть, например, так:

    try
    {
      ....
    }
    catch (AllocationError &e)
    {
      WriteLog("Memory Allocation Error");
      return false;
    }
    catch (IOError &e)
    {
      WriteLog("IO Error: %u", e.ErrorCode());
      return false;
    }

Рассмотрим другой пример. Это корректный код, но его можно упростить:

    try
    {
      ....
    }
    catch (std::exception &)
    {
      Disconnect();
    }
    catch (CException &)
    {
      Disconnect();
    }
    catch (...)
    {
      Disconnect();
    }

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

    try
    {
      ....
    }
    catch (...)
    {
      Disconnect();
    }

Рассмотрим ещё один пример.

    class DBException : public std::exception { ... };
    class SocketException : public DBException { ... };
    class AssertionException : public DBException { ... };
    ....
    try
    {
      ....
    }
    catch (SocketException& e){
      errorLog.push_back(e.what());
      continue;
    }
    catch (AssertionException& e) {
      errorLog.push_back(e.what());
      continue;
    }
    catch(std::exception& e){
      errorLog.push_back(e.what());
      continue;
    }

Есть несколько классов, которые наследуются от класса 'std::exception'. Все обработчики исключений совпадают. Обратите внимание, что в том числе, перехватывается и исключение типа 'std::exception'. Этот код избыточен. Можно оставить только обработчик для 'std::exception'. Остальные исключения будут так-же перехвачены и обработаны, так как наследуются от 'std::exception'. Метод 'what()' является виртуальным, поэтому в 'errorLog' будет сохранена правильная информация о типе ошибки.

Упрощенный код:

    try
    {
      ....
    }
    catch(std::exception& e){
      errorLog.push_back(e.what());
      continue;
    }