std::domain_error
Определён в заголовке <stdexcept> | ||
|---|---|---|
class domain_error; |
Определяет тип объекта, который может быть выброшен как исключение. Реализация может использовать его для сообщения об ошибках области определения, то есть ситуациях, когда входные данные находятся вне области, в которой определена операция.
Компоненты стандартной библиотеки не выбрасывают это исключение (математические функции сообщают об ошибках области определения согласно math_errhandling). Однако его используют сторонние библиотеки. Например, boost.math выбрасывает std::domain_error, если включён boost::math::policies::throw_on_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) |
what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg.c_str()) == 0.what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg) == 0.*this и other имеют динамический тип std::domain_error, то std::strcmp(what(), other.what()) == 0. Конструктор копирования не может выбросить исключение.Параметры
| what_arg | - | поясняющая строка |
| other | - | другой объект исключения для копирования |
Исключения
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
Функции-члены
|
[виртуальная] | уничтожает объект исключения (виртуальная открытая функция-член std::exception) |
|
[виртуальная] | возвращает поясняющую строку (виртуальная открытая функция-член 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