Подтвердить что ты не робот

Рекомендации по определению собственных классов исключений?

У меня есть специальные исключения, которые я хочу бросить и поймать, поэтому я хочу определить свои собственные классы исключений.

Каковы наилучшие методы для этого? Должен ли я наследовать от std::exception или std::runtime_error?

4b9b3361

Ответ 1

Да, это хорошая практика наследовать от std::runtime_error или другие стандартные классы исключений, такие как std::logic_error, std::invalid_argument и т.д., в зависимости от того, какое это исключение.

Если все исключения наследуют некоторый путь от std::exception, легко поймать все распространенные ошибки с помощью catch(const std::exception &e) {...}. Если у вас несколько независимых иерархий, это становится более сложным. Вывод из специализированных классов исключений делает эти исключения нести больше информации, но насколько это действительно полезно, зависит от того, как вы выполняете обработку исключений.

Ответ 2

Я не разработчик С++, но одна вещь, которую мы сделали в нашем коде на С#, создала исключение базового класса для нашей фреймворка, а затем занесло в конструктор исключение:

  public FrameworkException(string message, Exception innerException)
      : base(message, innerException)
  {
      log.Error(message, innerException);
  }

  ...

Любое производное исключение просто должно вызвать его базовый конструктор, и мы получаем согласованное ведение журнала исключений. Не очень, но полезно.

Ответ 3

Хорошо, когда исключение помещается в некоторую область видимости. Например, класс Manipulation может объявлять внутри классов исключений Error.

и поймать их как

catch ( const Manipulation::InputError& error )
catch ( const Manipulation::CalculationError& error )

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

Ответ 4

По-моему, неважно, наследуете ли вы от std:: exception или нет. Для меня самое важное в определении исключений:

  • Наличие имен классов исключений полезно и понятно.
  • Четкое документирование (запись комментариев), когда исключение будет вызвано функцией или классом. Это единственная самая большая точка отказа в обработке исключений, на мой взгляд.

Ответ 5

Это не имеет большого значения, поскольку std::runtime_error также наследуется от std::exception. Вы можете утверждать, что ошибка времени выполнения передает больше информации об исключении, но на практике люди часто просто выводятся из базового класса исключений.