﻿# V702\. Classes should always be derived from std::exception \(and alike\) as 'public'\.

Анализатор обнаружил класс, унаследованный от класса std::exception \(или аналогичных классов\) через модификатор private или protected\. Данное наследование опасно тем, что при непубличном наследовании при попытке поймать исключение std::exception оно будет пропущено\. 

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

В качестве примера можно привести следующий некорректный код:

```cpp
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:

```cpp
class my_exception_t : public std::exception
{
  ....
}
```