Список исключений стандартной библиотеки C ++? - PullRequest
15 голосов
/ 16 мая 2010

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

Ответы [ 2 ]

19 голосов
/ 16 мая 2010

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

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

  • Некоторые методы выдают out_of_range, если указанный индекс недействителен:
    • std::vector<>::at()
    • std::basic_string<>::at()
    • std::bitset<>::set(), reset() и flip().
  • Некоторые методы выдают std::overflow_error при целочисленном переполнении:
    • std::bitset<>::to_ulong() и (C ++ 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 после освобождения пуантиста выдается std::bad_weak_ptr.
  • Неправильное использование std::promise/std::future может привести к std::future_error.
  • (c ++ 11) Функции преобразования строк std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod и std::stold может бросить как std::invalid_argument, так и std::out_of_range.
  • (c ++ 11) В семействе регулярных выражений конструкторы и методы назначения могут генерировать std::regex_error.

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

Кроме того, для 3-го издания языка программирования C ++ , Бьярн Страуструп имеет загружаемое приложение о безопасности исключений , которое может иметь значение.

1 голос
/ 16 мая 2010

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

void ThisFunctionNeverThrows() throw()
{
}

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

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

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