Spec-Zone.ru › C++

std::domain_error

Определено в заголовке <stdexcept>
class domain_error;

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

Компоненты стандартной библиотеки не бросают это исключение (математические функции сообщают об ошибках области, как указано в math_errhandling). Однако сторонние библиотеки используют это. Например, boost.math бросает std::domain_error если boost::math::policies::throw_on_error включено (значение по умолчанию).

cpp/error/exception cpp/error/logic errorstd-domain error-inheritance.svg

Схема наследования

Члены-функции

(конструктор)
создает новый объект domain_error с заданным сообщением
(публичный член-функция)
operator=
заменяет объект domain_error
(публичный член-функция)

std::domain_error::domain_error

domain_error( const std::string& what_arg );
(1)
domain_error( const char* what_arg );
(2)
(3)
domain_error( const domain_error& other );
(до C++11)
domain_error( const domain_error& other ) noexcept;
(с C++11)
1) Создает объект исключения со строкой пояснения what_arg. После создания std::strcmp(what(), what_arg.c_str()) == 0.
2) Создает объект исключения со строкой пояснения what_arg. После создания std::strcmp(what(), what_arg) == 0.
3) Конструктор копирования. Если *this и other оба имеют динамический тип std::domain_error, то std::strcmp(what(), other.what()) == 0. Конструктор копирования не может бросить исключение.(до C++11)

Параметры

what_arg - строка пояснения
other - другой объект исключения для копирования

Исключения

1,2) Может бросить std::bad_alloc.

Примечания

Поскольку копирование std::domain_error запрещено для бросания исключений, это сообщение обычно хранится внутри как отдельная строка с подсчётом ссылок. Вот почему нет конструктора, принимающего std::string&&: ему всё равно пришлось бы скопировать содержимое.

До разрешения LWG issue 254, некопирующий конструктор может принимать только std::string. Это делает обязательной динамическую выделение для построения объекта std::string.

После разрешения LWG issue 471, производный класс стандартного исключения должен иметь публичный доступный конструктор копирования. Он может быть неявно определен, пока строки объяснений, полученные с помощью what(), будут одинаковыми для исходного объекта и скопированного объекта.

std::domain_error::operator=

domain_error& operator=( const domain_error& other );
(до C++11)
domain_error& operator=( const domain_error& other ) noexcept;
(с C++11)

Присваивает содержимое объекта с содержимым other. Если *this и other оба имеют динамический тип std::domain_error, то std::strcmp(what(), other.what()) == 0 после присваивания. Оператор присваивания копирования не может бросить исключение.(до C++11)

Параметры

other - другой объект исключения для присваивания

Возвращаемое значение

*this

Примечания

После разрешения LWG issue 471, производный класс стандартного исключения должен иметь публичный доступный оператор присваивания копирования. Он может быть неявно определен, пока строки объяснений, полученные с помощью what(), будут одинаковыми для исходного объекта и скопированного объекта.

Наследуется от std::logic_error

Наследуется от std::exception

Члены-функции

(деструктор)
[virtual]
уничтожает объект исключения
(виртуальная публичная член-функция std::exception)
what
[virtual]
возвращает строку пояснения
(виртуальная публичная член-функция std::exception)

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применен к Поведение, как опубликовано Корректное поведение
LWG 254 C++98 конструктор, принимающий const char* отсутствовал добавлено
LWG 471 C++98 строки объяснений копий std::domain_error$
были определены реализацией
они такие же, как у исходного
объекта std::domain_error

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/error/domain_error

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API