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

Есть ли ссылка на Исключения стандартной библиотеки С++? Я просто хочу знать, какие функции могут вызывать исключение или нет.

Ответы

Ответ 1

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

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

  • Некоторые методы будут бросать out_of_range, если указанный индекс недействителен:
    • std::vector<>::at()
    • std::basic_string<>::at()
    • std::bitset<>::set(), reset() и flip().
  • Некоторые методы будут бросать std::overflow_error на целочисленное переполнение:
    • std::bitset<>::to_ulong() и (С++ 0x) to_ullong().
  • std::allocator<T> будет передан std::bad_alloc, который вызывается new, который он вызывает.
  • Потоки могут быть настроены так, чтобы std::ios_base::failure были сброшены, когда бит состояния установлен.
  • Значения больших массивов могут вызывать std::bad_array_new_length
  • dynamic_cast по ссылке может вызывать std::bad_cast (технически не входит в стандартную библиотеку)
  • Отбрасывание недействительного исключения из функции с спецификацией исключения вызовет std::bad_exception
  • Вызов std::function::operator(...), если он не имеет значения, будет бросать std::bad_function_call.
  • Использование typeinfo нулевого указателя может вызвать std::bad_typeid.
  • Доступ к weak_ptr после того, как pointee был выпущен, будет бросать std::bad_weak_ptr.
  • Неправильное использование std::promise/std::future может вызвать std::future_error.
  • (С++ 11) Функции преобразования строк std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod и std::stold могут вызывать как std::invalid_argument и std::out_of_range.
  • (С++ 11) В семействе регулярных выражений конструкторы и методы присваивания могут бросать std::regex_error.

(Я делаю это ответом CW, поэтому, если кто-нибудь может подумать об этом больше, не стесняйтесь добавлять их сюда.)

Кроме того, для 3-го издания языка программирования С++ Bjarne Stroustrup имеет загружаемое приложение

Ответ 2

Единственными гарантированными (компилятором) функциями, которые не выбрасываются, являются функции, которые имеют спецификацию исключения throw(), например:

void ThisFunctionNeverThrows() throw()
{
}

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

См. статью Bjarne Stroustup о безопасности исключений и стандартной библиотеке: http://www2.research.att.com/~bs/3rd_safe.pdf Начиная со страницы 19 в формате PDF вы можете найти информацию о гарантии, сделанные стандартными контейнерами.