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

Что бросать при метании исключений С++?

Это может быть отчасти глупый вопрос, но в С++, когда я хочу выбросить исключение.. что я бросаю?

Я должен бросить std:: exception или зарезервирован стандартной библиотекой? Или я должен бросать строку или int? Или я должен просто бросать то, что, по моему мнению, уместно?

4b9b3361

Ответ 1

Выбросьте класс, полученный из std::exception; если вы #include <stdexcept>, вы можете выбрать из числа готовых, полезных производных классов.

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

Ответ 2

Как правило, люди не бросают std:: exception напрямую по той простой причине, что в нем нет сообщений об ошибках. Не было бы никакого способа вернуть метод. Иногда я запутался в этом, потому что MSVC предоставляет нестандартное расширение для этого параметризованного конструктора в std:: exception, который принимает строку.

Вы можете выбирать между существующими классами исключений, такими как std:: runtime_exception или определять свои собственные. Это несколько субъективно, но я рекомендую свести число классов исключений к минимуму, поскольку RAII может устранить большую потребность в наличии нескольких ветвей кода и блоков catch для разных типов исключений. Часто сообщение в сочетании с RAII-совместимым кодом достаточно, чтобы изящно восстановить из любого исключения.

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

Ответ 3

Основное исключение для того, чтобы выбрасывать что-то, полученное из std::exception, было бы, если вы используете некоторую фреймворк (например, MFC) со своей собственной иерархией исключений. В этом случае вы обычно хотите получить из соответствующего места в своей иерархии.

Обратите внимание, что я не особо пытаюсь использовать MFC в качестве примера чистой обработки исключений (или чистого дизайна в целом), только пример структуры, которая включает в себя иерархию исключений. Когда вы используете фреймворк, который уже определяет иерархию исключений, вам обычно лучше использовать его.

Другими словами, в отличие от предпочтений в С++, в противном случае принято считать, что исключения должны быть единой монолитной иерархией с одним корнем. Для стандартной библиотеки этот единственный корень std::exception, но в других средах есть альтернативы, и если они предоставляют один, который вы обычно хотите поместить в него.

Ответ 4

В отличие от java, вы можете выбрасывать все (int, string, MyClass, ...). Но послушайте Керрека.:)

Ответ 5

Обычно вам нужно выкинуть одно из исключений, полученных из std::exception, как говорили другие.

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