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 error

Диаграмма наследования

Функции-члены

(constructor)
создаёт новый объект 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)
domain_error( const domain_error& other );
(3) (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. Конструктор копирования не может выбросить исключение.

Параметры

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

Исключения

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

Примечания

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

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

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

std::domain_error::operator=

domain_error& operator=( const domain_error& other );
(noexcept начиная с C++11)

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

Параметры

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

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

*this

Примечания

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

Унаследовано от std::logic_error

Унаследовано от std::exception

Функции-члены

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

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

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

Отчёт об ошибке Применялся к Опубликованное поведение Правильное поведение
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/cpp/error/domain_error

Spec-Zone.ru

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