Лучшие практики для определения ваших собственных классов исключений? - PullRequest
33 голосов
/ 27 марта 2009

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

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

Ответы [ 5 ]

25 голосов
/ 27 марта 2009

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

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

6 голосов
/ 27 марта 2009

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

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

  ...

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

3 голосов
/ 27 марта 2009

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

и лови их как

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

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

1 голос
/ 27 марта 2009

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

1 голос
/ 27 марта 2009

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

  1. Наличие имен классов исключений будет полезным и понятным.
  2. Четко документирование (написание комментариев), когда исключение будет вызвано методом функции или класса. На мой взгляд, это самая большая ошибка в обработке исключений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...