Данное диагностическое правило добавлено по просьбе пользователей.
Обработчики для разных типов исключений выполняют одно и то же действие. Возможно это ошибка или код можно упростить.
Рассмотрим пример:
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;
}