std::domain_error
Определено в заголовке <stdexcept> | ||
|---|---|---|
class domain_error; |
Определяет тип объекта, который будет брошен как исключение. Он может использоваться реализацией для сообщения об ошибках области, то есть ситуациях, когда входные данные находятся за пределами области, в которой определена операция.
Компоненты стандартной библиотеки не бросают это исключение (математические функции сообщают об ошибках области, как указано в math_errhandling). Однако сторонние библиотеки используют это. Например, boost.math бросает std::domain_error если boost::math::policies::throw_on_error включено (значение по умолчанию).
Схема наследования
Члены-функции
| (конструктор) | создает новый объект 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) |
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. Конструктор копирования не может бросить исключение.(до C++11)
Параметры
| what_arg | - | строка пояснения |
| other | - | другой объект исключения для копирования |
Исключения
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) |
|
[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