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

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

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

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

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

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

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

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

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

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

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

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

```cpp
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' будет сохранена правильная информация о типе ошибки\.

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

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