std::ios_base::failure
Определено в заголовке <ios> | ||
|---|---|---|
class failure; |
Класс std::ios_base::failure определяет объект исключения, который выбрасывается при ошибке функциями библиотеки ввода/вывода.
|
| (с C++17) |
| Диаграмма наследования | (до C++11) |
| Диаграмма наследования | (с 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) |
message в качестве строки объяснения, которую можно получить позже с помощью what(). ec используется для идентификации конкретной причины ошибки.(с C++11)
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
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
Член-функции
| возвращает код ошибки (публичная член-функция std::system_error) |
|
|
[виртуальная] | возвращает строку объяснения (виртуальная публичная член-функция std::system_error) |
Унаследовано от std::runtime_error
Унаследовано от std::exception
Член-функции
|
[виртуальная] | уничтожает объект исключения (виртуальная публичная член-функция std::exception) |
|
[виртуальная] | возвращает строку объяснения (виртуальная публичная член-функция 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(). Это решение не было применено из-за конфликта между двумя решениями.
- Теперь не выбрасывающее исключение указание применяется по всему стандартному библиотечному коду, поэтому деструкторы стандартных библиотечных классов не объявляются с
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() | объявление деструктора удалено |
См. также
|
(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