Примечание. Данное диагностическое правило применимо только к языку C++.
Анализатор обнаружил класс, унаследованный от класса 'std::exception' (или аналогичных классов) через модификатор 'private' или 'protected'. Данное наследование опасно тем, что при непубличном наследовании при попытке поймать исключение 'std::exception', оно будет пропущено.
Ошибка часто возникает из-за того, что забывают указать тип наследования. В соответствии с правилами языка, наследование по умолчанию приватное. Как результат, обработчики исключений ведут себя не так, как задумывалось.
В качестве примера можно привести следующий некорректный код:
class my_exception_t : std::exception // <= { public: explicit my_exception_t() { } virtual const int getErrorCode() const throw() { return 42; } }; .... try { throw my_exception_t(); } catch (const std::exception & error) { /* Can't get there */ } catch (...) { /* This code executed instead */ }
Код, который должен будет перехватывать все стандартные и пользовательские исключения (catch (const std::exception & error)), не сможет отработать правильно, потому что приватное наследование исключает неявное преобразование типов.
Для того, чтобы код работал корректно, требуется добавить перед родительским классом 'std::exception' в списке базовых классов модификатор 'public':
class my_exception_t : public std::exception { .... }
Данная диагностика классифицируется как:
|