В этом разделе описаны компоненты, которые программы C ++ могут использовать для обнаружения и сообщения об ошибках.
В следующих подпунктах описываются компоненты для сообщения о нескольких видах исключительных состояний, документирования программных утверждений и глобальной переменной для кодов номеров ошибок, как показано в таблице 33.
Подпункт | Заголовок (ы) | |
[std.exceptions] | Классы исключений | <stdexcept> |
[assertions] | Утверждения | <cassert> |
[errno] | Номера ошибок | <cerrno> |
[syserr] | Поддержка системных ошибок | <system_error> |
Стандартная библиотека C ++ предоставляет классы, которые можно использовать для сообщения об определенных ошибках ([res.on.exception.handling]) в программах на C ++. В модели ошибок, отраженной в этих классах, ошибки делятся на две широкие категории: logic ошибки и runtime ошибки.
Отличительной особенностью логических ошибок является то, что они возникают из-за ошибок во внутренней логике программы. Теоретически их можно предотвратить.
Напротив, ошибки времени выполнения возникают из-за событий, выходящих за рамки программы. Их нелегко предсказать заранее. Заголовок определяет несколько типов предопределенных исключений для сообщения об ошибках в программе на C ++. Эти исключения связаны наследованием.<stdexcept>
namespace std { class logic_error; class domain_error; class invalid_argument; class length_error; class out_of_range; class runtime_error; class range_error; class overflow_error; class underflow_error; }
namespace std { class logic_error : public exception { public: explicit logic_error(const string& what_arg); explicit logic_error(const char* what_arg); }; }
Класс logic_error определяет тип объектов, создаваемых как исключения для сообщения об ошибках, предположительно обнаруживаемых до выполнения программы, таких как нарушения логических предварительных условий или инвариантов класса.
logic_error(const string& what_arg);
logic_error(const char* what_arg);
namespace std { class domain_error : public logic_error { public: explicit domain_error(const string& what_arg); explicit domain_error(const char* what_arg); }; }
Класс domain_error определяет тип объектов, создаваемых реализацией как исключения для сообщения об ошибках домена.
domain_error(const string& what_arg);
domain_error(const char* what_arg);
namespace std { class invalid_argument : public logic_error { public: explicit invalid_argument(const string& what_arg); explicit invalid_argument(const char* what_arg); }; }
Класс invalid_argument определяет тип объектов, создаваемых как исключения для сообщения о недопустимом аргументе.
invalid_argument(const string& what_arg);
invalid_argument(const char* what_arg);
namespace std { class length_error : public logic_error { public: explicit length_error(const string& what_arg); explicit length_error(const char* what_arg); }; }
Класс length_error определяет тип объектов, создаваемых как исключения, чтобы сообщить о попытке создания объекта, длина которого превышает его максимально допустимый размер.
length_error(const string& what_arg);
length_error(const char* what_arg);
namespace std { class out_of_range : public logic_error { public: explicit out_of_range(const string& what_arg); explicit out_of_range(const char* what_arg); }; }
Класс out_of_range определяет тип объектов, создаваемых как исключения, чтобы сообщить значение аргумента, выходящее за пределы ожидаемого диапазона.
out_of_range(const string& what_arg);
out_of_range(const char* what_arg);
namespace std { class runtime_error : public exception { public: explicit runtime_error(const string& what_arg); explicit runtime_error(const char* what_arg); }; }
Класс runtime_error определяет тип объектов, создаваемых как исключения для сообщения об ошибках, предположительно обнаруживаемых только при выполнении программы.
runtime_error(const string& what_arg);
runtime_error(const char* what_arg);
namespace std { class range_error : public runtime_error { public: explicit range_error(const string& what_arg); explicit range_error(const char* what_arg); }; }
Класс range_error определяет тип объектов, создаваемых как исключения для сообщения об ошибках диапазона во внутренних вычислениях.
range_error(const string& what_arg);
range_error(const char* what_arg);
namespace std { class overflow_error : public runtime_error { public: explicit overflow_error(const string& what_arg); explicit overflow_error(const char* what_arg); }; }
Класс overflow_error определяет тип объектов, создаваемых как исключения для сообщения об ошибке арифметического переполнения.
overflow_error(const string& what_arg);
overflow_error(const char* what_arg);
namespace std { class underflow_error : public runtime_error { public: explicit underflow_error(const string& what_arg); explicit underflow_error(const char* what_arg); }; }
Класс underflow_error определяет тип объектов, создаваемых как исключения для сообщения об арифметической ошибке недостаточного заполнения.
underflow_error(const string& what_arg);
underflow_error(const char* what_arg);
Заголовок <cassert> предоставляет макрос для документирования утверждений программы C ++ и механизм отключения проверок утверждений.
#define assert(E) see below
Выражение assert(E) - это constant subexpression, если
NDEBUG определяется в точке assert последнего определения или переопределения, или
E contextually converted to bool - константное подвыражение, возвращающее значение true.
Содержимое заголовка <cerrno> такое же, как и заголовок POSIX <errno.h>, за исключением того errno , что он должен быть определен как макрос. [ Note: Намерение состоит в том, чтобы оставаться в тесном соответствии со стандартом POSIX. ] Для каждого потока должно быть указано отдельное значение. — end note errno
#define errno see below #define E2BIG see below #define EACCES see below #define EADDRINUSE see below #define EADDRNOTAVAIL see below #define EAFNOSUPPORT see below #define EAGAIN see below #define EALREADY see below #define EBADF see below #define EBADMSG see below #define EBUSY see below #define ECANCELED see below #define ECHILD see below #define ECONNABORTED see below #define ECONNREFUSED see below #define ECONNRESET see below #define EDEADLK see below #define EDESTADDRREQ see below #define EDOM see below #define EEXIST see below #define EFAULT see below #define EFBIG see below #define EHOSTUNREACH see below #define EIDRM see below #define EILSEQ see below #define EINPROGRESS see below #define EINTR see below #define EINVAL see below #define EIO see below #define EISCONN see below #define EISDIR see below #define ELOOP see below #define EMFILE see below #define EMLINK see below #define EMSGSIZE see below #define ENAMETOOLONG see below #define ENETDOWN see below #define ENETRESET see below #define ENETUNREACH see below #define ENFILE see below #define ENOBUFS see below #define ENODATA see below #define ENODEV see below #define ENOENT see below #define ENOEXEC see below #define ENOLCK see below #define ENOLINK see below #define ENOMEM see below #define ENOMSG see below #define ENOPROTOOPT see below #define ENOSPC see below #define ENOSR see below #define ENOSTR see below #define ENOSYS see below #define ENOTCONN see below #define ENOTDIR see below #define ENOTEMPTY see below #define ENOTRECOVERABLE see below #define ENOTSOCK see below #define ENOTSUP see below #define ENOTTY see below #define ENXIO see below #define EOPNOTSUPP see below #define EOVERFLOW see below #define EOWNERDEAD see below #define EPERM see below #define EPIPE see below #define EPROTO see below #define EPROTONOSUPPORT see below #define EPROTOTYPE see below #define ERANGE see below #define EROFS see below #define ESPIPE see below #define ESRCH see below #define ETIME see below #define ETIMEDOUT see below #define ETXTBSY see below #define EWOULDBLOCK see below #define EXDEV see below
В этом подпункте описываются компоненты, которые стандартная библиотека и программы C ++ могут использовать для сообщения об ошибках, возникающих из операционной системы или других низкоуровневых прикладных программных интерфейсов.
Компоненты, описанные в этом подпункте, не должны изменять значение errno. Реализации должны оставлять без изменений состояния ошибок, предоставляемые другими библиотеками.
namespace std { class error_category; const error_category& generic_category() noexcept; const error_category& system_category() noexcept; class error_code; class error_condition; class system_error; template <class T> struct is_error_code_enum : public false_type {}; template <class T> struct is_error_condition_enum : public false_type {}; enum class errc { address_family_not_supported, // EAFNOSUPPORT address_in_use, // EADDRINUSE address_not_available, // EADDRNOTAVAIL already_connected, // EISCONN argument_list_too_long, // E2BIG argument_out_of_domain, // EDOM bad_address, // EFAULT bad_file_descriptor, // EBADF bad_message, // EBADMSG broken_pipe, // EPIPE connection_aborted, // ECONNABORTED connection_already_in_progress, // EALREADY connection_refused, // ECONNREFUSED connection_reset, // ECONNRESET cross_device_link, // EXDEV destination_address_required, // EDESTADDRREQ device_or_resource_busy, // EBUSY directory_not_empty, // ENOTEMPTY executable_format_error, // ENOEXEC file_exists, // EEXIST file_too_large, // EFBIG filename_too_long, // ENAMETOOLONG function_not_supported, // ENOSYS host_unreachable, // EHOSTUNREACH identifier_removed, // EIDRM illegal_byte_sequence, // EILSEQ inappropriate_io_control_operation, // ENOTTY interrupted, // EINTR invalid_argument, // EINVAL invalid_seek, // ESPIPE io_error, // EIO is_a_directory, // EISDIR message_size, // EMSGSIZE network_down, // ENETDOWN network_reset, // ENETRESET network_unreachable, // ENETUNREACH no_buffer_space, // ENOBUFS no_child_process, // ECHILD no_link, // ENOLINK no_lock_available, // ENOLCK no_message_available, // ENODATA no_message, // ENOMSG no_protocol_option, // ENOPROTOOPT no_space_on_device, // ENOSPC no_stream_resources, // ENOSR no_such_device_or_address, // ENXIO no_such_device, // ENODEV no_such_file_or_directory, // ENOENT no_such_process, // ESRCH not_a_directory, // ENOTDIR not_a_socket, // ENOTSOCK not_a_stream, // ENOSTR not_connected, // ENOTCONN not_enough_memory, // ENOMEM not_supported, // ENOTSUP operation_canceled, // ECANCELED operation_in_progress, // EINPROGRESS operation_not_permitted, // EPERM operation_not_supported, // EOPNOTSUPP operation_would_block, // EWOULDBLOCK owner_dead, // EOWNERDEAD permission_denied, // EACCES protocol_error, // EPROTO protocol_not_supported, // EPROTONOSUPPORT read_only_file_system, // EROFS resource_deadlock_would_occur, // EDEADLK resource_unavailable_try_again, // EAGAIN result_out_of_range, // ERANGE state_not_recoverable, // ENOTRECOVERABLE stream_timeout, // ETIME text_file_busy, // ETXTBSY timed_out, // ETIMEDOUT too_many_files_open_in_system, // ENFILE too_many_files_open, // EMFILE too_many_links, // EMLINK too_many_symbolic_link_levels, // ELOOP value_too_large, // EOVERFLOW wrong_protocol_type, // EPROTOTYPE }; template <> struct is_error_condition_enum<errc> : true_type {}; // [syserr.errcode.nonmembers], non-member functions error_code make_error_code(errc e) noexcept; template <class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const error_code& ec); // [syserr.errcondition.nonmembers], non-member functions error_condition make_error_condition(errc e) noexcept; // [syserr.compare], comparison functions bool operator<(const error_code& lhs, const error_code& rhs) noexcept; bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept; bool operator==(const error_code& lhs, const error_code& rhs) noexcept; bool operator==(const error_code& lhs, const error_condition& rhs) noexcept; bool operator==(const error_condition& lhs, const error_code& rhs) noexcept; bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept; bool operator!=(const error_code& lhs, const error_code& rhs) noexcept; bool operator!=(const error_code& lhs, const error_condition& rhs) noexcept; bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept; bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept; // [syserr.hash], hash support template <class T> struct hash; template <> struct hash<error_code>; template <> struct hash<error_condition>; // [syserr], system error support template <class T> inline constexpr bool is_error_code_enum_v = is_error_code_enum<T>::value; template <class T> inline constexpr bool is_error_condition_enum_v = is_error_condition_enum<T>::value; }
Значение каждой enum errc константы должно быть таким же, как значение <cerrno> макроса, показанного в приведенном выше синопсисе. Не указано, <system_error> предоставляет ли реализация <cerrno> макросы.
Класс error_category служит базовым классом для типов, используемых для идентификации источника и кодирования конкретной категории кода ошибки. Классы могут быть производными error_category для поддержки категорий ошибок в дополнение к тем, которые определены в этом международном стандарте. Такие классы должны вести себя, как указано в этом подпункте. [ Note: error_category объекты передаются по ссылке, и два таких объекта равны, если у них одинаковый адрес. Это означает, что приложения, использующие настраиваемые error_category типы, должны создавать по одному объекту каждого такого типа. ] — end note
namespace std { class error_category { public: constexpr error_category() noexcept; virtual ~error_category(); error_category(const error_category&) = delete; error_category& operator=(const error_category&) = delete; virtual const char* name() const noexcept = 0; virtual error_condition default_error_condition(int ev) const noexcept; virtual bool equivalent(int code, const error_condition& condition) const noexcept; virtual bool equivalent(const error_code& code, int condition) const noexcept; virtual string message(int ev) const = 0; bool operator==(const error_category& rhs) const noexcept; bool operator!=(const error_category& rhs) const noexcept; bool operator<(const error_category& rhs) const noexcept; }; const error_category& generic_category() noexcept; const error_category& system_category() noexcept; }
virtual ~error_category();
virtual const char* name() const noexcept = 0;
virtual error_condition default_error_condition(int ev) const noexcept;
virtual bool equivalent(int code, const error_condition& condition) const noexcept;
virtual bool equivalent(const error_code& code, int condition) const noexcept;
virtual string message(int ev) const = 0;
constexpr error_category() noexcept;
bool operator==(const error_category& rhs) const noexcept;
bool operator!=(const error_category& rhs) const noexcept;
bool operator<(const error_category& rhs) const noexcept;
virtual const char* name() const noexcept = 0;
virtual error_condition default_error_condition(int ev) const noexcept;
virtual bool equivalent(int code, const error_condition& condition) const noexcept;
Returns: true если для категории ошибки, представленной значком *this, code считается эквивалентным condition; в противном случае false.
virtual bool equivalent(const error_code& code, int condition) const noexcept;
const error_category& generic_category() noexcept;
Returns: Ссылка на объект типа, производного от класса error_category. Все вызовы этой функции должны возвращать ссылки на один и тот же объект.
Remarks: Объектные default_error_condition и equivalent виртуальные функции должны вести себя, как указано для класса error_category. name Виртуальная функция объекта должна возвращать указатель на строку "generic".
const error_category& system_category() noexcept;
Returns: Ссылка на объект типа, производного от класса error_category. Все вызовы этой функции должны возвращать ссылки на один и тот же объект.
Remarks: equivalent Виртуальные функции объекта должны вести себя, как указано для класса error_category. name Виртуальная функция объекта должна возвращать указатель на строку "system". default_error_condition Виртуальная функция объекта должна вести себя следующим образом:
Если аргумент ev соответствует errno значению POSIX posv, функция должна вернуться error_condition(posv, generic_category()). В противном случае функция вернется error_condition(ev, system_category()). Что составляет соответствие для той или иной операционной системы, не определено. [ Note: Количество кодов потенциальных системных ошибок велико и неограниченно, и некоторые из них могут не соответствовать какому-либо errno значению POSIX . Таким образом, реализациям предоставляется свобода в определении соответствия. ] — end note
Класс error_code описывает объект, используемый для хранения значений кодов ошибок, например, исходящих из операционной системы или других низкоуровневых программных интерфейсов приложений. [ Note: Класс error_code является дополнением к сообщениям об ошибках по исключениям. ] — end note
namespace std { class error_code { public: // [syserr.errcode.constructors], constructors error_code() noexcept; error_code(int val, const error_category& cat) noexcept; template <class ErrorCodeEnum> error_code(ErrorCodeEnum e) noexcept; // [syserr.errcode.modifiers], modifiers void assign(int val, const error_category& cat) noexcept; template <class ErrorCodeEnum> error_code& operator=(ErrorCodeEnum e) noexcept; void clear() noexcept; // [syserr.errcode.observers], observers int value() const noexcept; const error_category& category() const noexcept; error_condition default_error_condition() const noexcept; string message() const; explicit operator bool() const noexcept; private: int val_; // exposition only const error_category* cat_; // exposition only }; // [syserr.errcode.nonmembers], non-member functions error_code make_error_code(errc e) noexcept; template <class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const error_code& ec); }
error_code() noexcept;
error_code(int val, const error_category& cat) noexcept;
template <class ErrorCodeEnum>
error_code(ErrorCodeEnum e) noexcept;
void assign(int val, const error_category& cat) noexcept;
template <class ErrorCodeEnum>
error_code& operator=(ErrorCodeEnum e) noexcept;
Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если
is_error_code_enum_v<ErrorCodeEnum> не true.
void clear() noexcept;
int value() const noexcept;
const error_category& category() const noexcept;
error_condition default_error_condition() const noexcept;
string message() const;
explicit operator bool() const noexcept;
error_code make_error_code(errc e) noexcept;
template <class charT, class traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const error_code& ec);
Класс error_condition описывает объект, используемый для хранения значений, идентифицирующих условия ошибки. [ Note: error_condition значения - это переносимые абстракции, а error_code значения зависят от реализации. ] — end note
namespace std { class error_condition { public: // [syserr.errcondition.constructors], constructors error_condition() noexcept; error_condition(int val, const error_category& cat) noexcept; template <class ErrorConditionEnum> error_condition(ErrorConditionEnum e) noexcept; // [syserr.errcondition.modifiers], modifiers void assign(int val, const error_category& cat) noexcept; template <class ErrorConditionEnum> error_condition& operator=(ErrorConditionEnum e) noexcept; void clear() noexcept; // [syserr.errcondition.observers], observers int value() const noexcept; const error_category& category() const noexcept; string message() const; explicit operator bool() const noexcept; private: int val_; // exposition only const error_category* cat_; // exposition only }; }
error_condition() noexcept;
error_condition(int val, const error_category& cat) noexcept;
template <class ErrorConditionEnum>
error_condition(ErrorConditionEnum e) noexcept;
void assign(int val, const error_category& cat) noexcept;
template <class ErrorConditionEnum>
error_condition& operator=(ErrorConditionEnum e) noexcept;
Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если
is_error_condition_enum_v<ErrorConditionEnum> не true.
void clear() noexcept;
int value() const noexcept;
const error_category& category() const noexcept;
string message() const;
explicit operator bool() const noexcept;
error_condition make_error_condition(errc e) noexcept;
bool operator<(const error_code& lhs, const error_code& rhs) noexcept;
Returns:
lhs.category() < rhs.category() || (lhs.category() == rhs.category() && lhs.value() < rhs.value());
bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept;
Returns: lhs.category() < rhs.category() || lhs.category() == rhs.category() &&
lhs.value() < rhs.value().
bool operator==(const error_code& lhs, const error_code& rhs) noexcept;
bool operator==(const error_code& lhs, const error_condition& rhs) noexcept;
Returns: lhs.category().equivalent(lhs.value(), rhs) || rhs.category().equivalent(lhs, rhs.value()).
bool operator==(const error_condition& lhs, const error_code& rhs) noexcept;
Returns: rhs.category().equivalent(rhs.value(), lhs) || lhs.category().equivalent(rhs, lhs.value()).
bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;
bool operator!=(const error_code& lhs, const error_code& rhs) noexcept;
bool operator!=(const error_code& lhs, const error_condition& rhs) noexcept;
bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept;
bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;
template <> struct hash<error_code>;
template <> struct hash<error_condition>;
Специализации включены ([unord.hash]).
Класс system_error описывает объект исключения, используемый для сообщения об ошибках, которые имеют связанный код ошибки. Такие состояния ошибки обычно возникают из-за операционной системы или других низкоуровневых программных интерфейсов приложений.
[ Note: Если ошибка представляет собой состояние нехватки памяти, реализациям рекомендуется генерировать объект исключения типа, bad_alloc а не system_error. ] — end note
namespace std { class system_error : public runtime_error { public: system_error(error_code ec, const string& what_arg); system_error(error_code ec, const char* what_arg); system_error(error_code ec); system_error(int ev, const error_category& ecat, const string& what_arg); system_error(int ev, const error_category& ecat, const char* what_arg); system_error(int ev, const error_category& ecat); const error_code& code() const noexcept; const char* what() const noexcept override; }; }
system_error(error_code ec, const string& what_arg);
system_error(error_code ec, const char* what_arg);
system_error(error_code ec);
system_error(int ev, const error_category& ecat, const string& what_arg);
system_error(int ev, const error_category& ecat, const char* what_arg);
system_error(int ev, const error_category& ecat);
const error_code& code() const noexcept;
const char* what() const noexcept override;