Spec-Zone.ru › C++

std::ios_base::failure

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

Класс std::ios_base::failure определяет объект исключения, который выбрасывается при ошибке функциями библиотеки ввода/вывода.

std::ios_base::failure может быть определен как член класса std::ios_base или как синоним (typedef) для другого класса с эквивалентными функциями.

(с C++17)
cpp/error/exceptionstd-ios base-failure-2003-inheritance.svg

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

(до C++11)
cpp/error/exception cpp/error/runtime error cpp/error/system errorstd-ios base-failure-inheritance.svg

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

(с C++11)

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

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

std::ios_base::failure::failure

(1)
explicit failure( const std::string& message );
(до C++11)
explicit failure( const std::string& message, 
                  const std::error_code& ec = std::io_errc::stream );
(с C++11)
explicit failure( const char* message,
                  const std::error_code& ec = std::io_errc::stream );
(2) (с C++11)
(3)
failure( const failure& other );
(до C++11)
failure( const failure& other ) noexcept;
(с C++11)
1,2) Конструирует объект исключения, используя message в качестве строки объяснения, которую можно получить позже с помощью what(). ec используется для идентификации конкретной причины ошибки.(с C++11)
3) Копирующий конструктор. Инициализирует содержимое значениями объекта other. Если *this и other имеют динамический тип std::ios_base::failure, то std::strcmp(what(), other.what()) == 0. (с C++11)

Параметры

message - строка объяснения
ec - код ошибки для идентификации конкретной причины ошибки
other - другой объект failure для копирования

Примечания

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

std::ios_base::failure::operator=

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

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

Параметры

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

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

*this

END_OF_DOCUMENT_MARKER

std::ios_base::failure::what

virtual const char* what() const throw();
(до C++11)
virtual const char* what() const noexcept;
(с C++11)

Возвращает строку объяснения.

Параметры

(нет)

Значение результата

Указатель на завершающую нулём строку с информацией об объяснении. Строка подходит для преобразования и отображения как std::wstring. Указатель гарантированно остается допустимым как минимум до тех пор, пока объект исключения, из которого он получен, не будет уничтожен, или пока не будет вызван не-константный член-функции (например, оператор копирования присваивания) объекта исключения.

Примечания

Реализации разрешено, но не обязательно переопределять what().

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

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

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

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

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

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

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

Примечания

До решения проблемы LWG issue 331, std::ios_base::failure объявляла деструктор без throw(), где std::exception::~exception() объявлялась с throw()[1]. Это означает, что у std::ios_base::failure::~failure() было более слабое указание на исключение. Решением является удаление этого объявления, чтобы сохранить не выбрасывающее исключение указание.

LWG issue 363 нацелена на ту же проблему и ее решением является добавление throw() к объявлению std::ios_base::failure::~failure(). Это решение не было применено из-за конфликта между двумя решениями.

  1. Теперь не выбрасывающее исключение указание применяется по всему стандартному библиотечному коду, поэтому деструкторы стандартных библиотечных классов не объявляются с throw() или noexcept.

Пример

#include <fstream>
#include <iostream>
 
int main()
{
    std::ifstream f("doesn't exist");
 
    try
    {
        f.exceptions(f.failbit);
    }
    catch (const std::ios_base::failure& e)
    {
        std::cout << "Caught an ios_base::failure.\n"
                  << "Explanatory string: " << e.what() << '\n'
                  << "Error code: " << e.code() << '\n';
    }
}

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

Caught an ios_base::failure.
Explanatory string: ios_base::clear: unspecified iostream_category error
Error code: iostream:1

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

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

DR Применено к Поведение, как опубликовано Правильное поведение
LWG 48 C++98 перегрузка конструктора (1) инициализировала базовый класс std::exception
с msg, но у базового класса нет соответствующего конструктора
соответствующее
описание удалено
LWG 331 C++98 std::ios_base::failure объявлял деструктор без throw() объявление деструктора удалено

См. также

io_errc
(C++11)
коды ошибок потокового ввода/вывода
(перечисление)

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

Spec-Zone.ru

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