Когда бросать различные виды исключений полезно? - PullRequest
1 голос
/ 23 мая 2011

Полезно ли выдавать различные исключения, например std::runtime_error или std::invalid_argument в огромных проектах? Или лучше вообще скинуть std::exception с хорошим текстовым параметром для what()? И когда имеет смысл вывести некоторые подклассы из std::exception?

Румо

Ответы [ 4 ]

6 голосов
/ 23 мая 2011

Всегда имеет смысл использовать throw самое конкретное исключение. Поскольку каждое исключение должно быть получено из std::exception, перехват кода может решить, на каком уровне детализации он хочет его обработать (поймать по ссылке! Пункт 13 в "Более эффективном C ++" от С. Мейерса).

Использование только std::exception без текста:

  • необязательное ограничение возможности использования кода перехвата
  • код перехвата должен был бы проанализировать текст для базовой логики, если бы он должен был выполнять различные действия в зависимости от типа исключения (что может быть реализовано с меньшими затратами с RTTI)
  • Я не могу вспомнить ни одного случая, когда это было бы выгодно. Переопределение what() обеспечивает адекватный текст для любого исключения, если вам нужно.
2 голосов
/ 23 мая 2011

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

try {
    object.method();
}
catch (LogicalException& e) {
    // if it's a LogicalException, handle it here
}
catch (Exception& e) {
    // otherwise, handle a general exception here.
}

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

0 голосов
/ 15 декабря 2011

Хотя я в принципе согласен, что

Всегда имеет смысл использовать throw самое конкретное исключение

это может или не может быть необходимо.

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

И я все это выбросил. Не потому что это было плохо, я бросил это, потому что это было совершенно ненужно.

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

Лучшим решением в нашем случае была система, которая записывала различительный след хлебных крошек в файл и затем отображала эквивалент «ой, извините!» в следующем соответствующем состоянии ожидания вместе со ссылкой на техподдержку.

Это было наше приложение. Возможно, вы пишете библиотеку, и в этом случае игнорируйте все, что я только что сказал.

Итак, извините, это звучит как полицейский, но ответ на ваш вопрос:

Это зависит.

0 голосов
/ 23 мая 2011

Все классы исключений Стандартного C ++ являются производными от класса std::exception.Таким образом, код перехвата может перехватить исключение в std::exception & или с определенным обработчиком clas, но имеет больше смысла выдать определенное исключение, чтобы соответствующий обработчик мог обработать определенное исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...