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