close
Пространства имён
Варианты
Действия

std::invalid_argument

Материал из cppreference.com
 
 
Библиотека диагностики
Обработка исключений
Сбои обработки исключений
(до C++17*)
(до C++17*)
(C++11)(до C++17*)    
(до C++17*)
Коды ошибок
Коды ошибок
Категории исключений
(ТС TM)
Поддержка системных ошибок
(C++11)
(C++11)
Утверждения
Трассировка стека
 
<tbody> </tbody>
Определено в заголовочном файле <stdexcept>
class invalid_argument;

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

Это исключение генерируется функциями std::bitset::bitset и семействами функций std::stoi и std::stof.

Imagecpp/error/exceptioncpp/error/logic error

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

Функции-элементы

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

std::invalid_argument::invalid_argument

<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
invalid_argument( const std::string& what_arg );
(1)
invalid_argument( const char* what_arg );
(2)
(3)
invalid_argument( const invalid_argument& other );
(до C++11)
invalid_argument( const invalid_argument& 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::invalid_argument, тогда std::strcmp(what(), other.what()) == 0. Исключения не могут быть сгенерированы из конструктора копирования. (до C++11)

Параметры

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

Исключения

1,2) Может генерировать std::bad_alloc.

Примечание

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

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

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

std::invalid_argument::operator=

<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
invalid_argument& operator=( const invalid_argument& other );
(до C++11)
invalid_argument& operator=( const invalid_argument& other ) noexcept;
(начиная с C++11)

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

Параметры

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

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

*this

Примечание

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

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

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

Функции-элементы

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

Примечание

Цель этого типа исключения аналогична условию ошибки std::errc::invalid_argument (выброшенному в std::system_error из функций-элементов std::thread) и соответствующей константе errno EINVAL.

Пример

#include <bitset>
#include <iostream>
#include <stdexcept>
#include <string>

int main()
{
    try
    {
        std::bitset<4>{"012"}; // Генерирует: ожидается только '0' или '1'
    }
    catch (std::invalid_argument const& ex)
    {
        std::cout << "#1: " << ex.what() << '\n';
    }
    
    try
    {
        [[maybe_unused]] int f = std::stoi("ABBA"); // Генерирует: no conversion
    }
    catch (std::invalid_argument const& ex)
    {
        std::cout << "#2: " << ex.what() << '\n';
    }

    try
    {
        [[maybe_unused]] float f = std::stof("(3.14)"); // Генерирует: no conversion
    }
    catch (std::invalid_argument const& ex)
    {
        std::cout << "#3: " << ex.what() << '\n';
    }
}

Возможный вывод:

#1: bitset string ctor has invalid argument
#2: stoi: no conversion
#3: stof: no conversion

Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

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