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

Stdexcept vs exception Заголовки в С++

Из справки cplusplus.com для <exception> и для <stdexcept>, кажется, что <exception> достаточно для обработки исключений в С++ 98 или более поздних версиях С++.

Почему у С++ есть два файла заголовков для обработки исключений? Как это влияет на мое развитие? Какой заголовок я должен использовать?

4b9b3361

Ответ 1

  • <stdexcept>: Определяет набор стандартных исключений, которые могут использоваться как библиотекой, так и программами для сообщения об общих ошибках.

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

Таким образом, <exception> определяет класс std::exception, а <stdexcept> определяет несколько классов, которые наследуют от std::exception (например, std::logic_error, std::out_of_range). Вот почему <stdexcept> включает <exception>.

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

Ответ 2

Одно практическое соображение состоит в том, что <stdexcept> требует определения std::string (конструкторы исключений принимают std::string и имеют элемент данных std::string), тогда как для запроса catch и запроса std::exception std::string объявления или определения не требуется.

Другими словами, обработчику std::exception требуется только <exception>. Для сайта throw требуется заголовок определенного класса исключений, который он бросает.