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

Примечание\. Данное диагностическое правило применимо только к языку C\+\+\.

Анализатор обнаружил класс, унаследованный от класса '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
{
  ....
}
```