22 Diagnostics library [diagnostics]

22.1 General [diagnostics.general]

В этом разделе описаны компоненты, которые программы C ++ могут использовать для обнаружения и сообщения об ошибках.

В следующих подпунктах описываются компоненты для сообщения о нескольких видах исключительных состояний, документирования программных утверждений и глобальной переменной для кодов номеров ошибок, как показано в таблице 33.

Таблица 33 - Сводка библиотеки диагностики
Подпункт Заголовок (ы)
[std.exceptions] Классы исключений <stdexcept>
[assertions] Утверждения <cassert>
[errno] Номера ошибок <cerrno>
[syserr] Поддержка системных ошибок <system_­error>

22.2 Exception classes [std.exceptions]

Стандартная библиотека C ++ предоставляет классы, которые можно использовать для сообщения об определенных ошибках ([res.on.exception.handling]) в программах на C ++. В модели ошибок, отраженной в этих классах, ошибки делятся на две широкие категории: logic ошибки и runtime ошибки.

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

Напротив, ошибки времени выполнения возникают из-за событий, выходящих за рамки программы. Их нелегко предсказать заранее. Заголовок определяет несколько типов предопределенных исключений для сообщения об ошибках в программе на C ++. Эти исключения связаны наследованием.<stdexcept>

22.2.1 Header <stdexcept> synopsis [stdexcept.syn]

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;
}

22.2.2 Class logic_­error [logic.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);

Effects: Создает объект класса logic_­error.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

logic_error(const char* what_arg);

Effects: Создает объект класса logic_­error.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.3 Class domain_­error [domain.error]

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);

Effects: Создает объект класса domain_­error.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

domain_error(const char* what_arg);

Effects: Создает объект класса domain_­error.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.4 Class invalid_­argument [invalid.argument]

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);

Effects: Создает объект класса invalid_­argument.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

invalid_argument(const char* what_arg);

Effects: Создает объект класса invalid_­argument.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.5 Class length_­error [length.error]

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);

Effects: Создает объект класса length_­error.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

length_error(const char* what_arg);

Effects: Создает объект класса length_­error.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.6 Class out_­of_­range [out.of.range]

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);

Effects: Создает объект класса out_­of_­range.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

out_of_range(const char* what_arg);

Effects: Создает объект класса out_­of_­range.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.7 Class runtime_­error [runtime.error]

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);

Effects: Создает объект класса runtime_­error.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

runtime_error(const char* what_arg);

Effects: Создает объект класса runtime_­error.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.8 Class range_­error [range.error]

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);

Effects: Создает объект класса range_­error.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

range_error(const char* what_arg);

Effects: Создает объект класса range_­error.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.9 Class overflow_­error [overflow.error]

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);

Effects: Создает объект класса overflow_­error.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

overflow_error(const char* what_arg);

Effects: Создает объект класса overflow_­error.

Postconditions: strcmp(what(), what_­arg) == 0.

22.2.10 Class underflow_­error [underflow.error]

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);

Effects: Создает объект класса underflow_­error.

Postconditions: strcmp(what(), what_­arg.c_­str()) == 0.

underflow_error(const char* what_arg);

Effects: Создает объект класса underflow_­error.

Postconditions: strcmp(what(), what_­arg) == 0.

22.3 Assertions [assertions]

Заголовок <cassert> предоставляет макрос для документирования утверждений программы C ++ и механизм отключения проверок утверждений.

22.3.1 Header <cassert> synopsis [cassert.syn]

#define assert(E) see below

Содержимое такое же, как заголовок стандартной библиотеки C <assert.h>, за исключением того, что названный макрос static_­assert не определен.

См. Также: ISO C 7.2.

22.3.2 The assert macro [assertions.assert]

Выражение assert(E) - это constant subexpression, если

  • NDEBUG определяется в точке assert последнего определения или переопределения, или

  • E contextually converted to bool - константное подвыражение, возвращающее значение true.

22.4 Error numbers [errno]

Содержимое заголовка <cerrno> такое же, как и заголовок POSIX <errno.h>, за исключением того errno , что он должен быть определен как макрос. [ Note: Намерение состоит в том, чтобы оставаться в тесном соответствии со стандартом POSIX. ] Для каждого потока должно быть указано отдельное значение.end note errno

22.4.1 Header <cerrno> synopsis [cerrno.syn]

#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

Значение макросов в этом заголовке определяется стандартом POSIX.

См. Также: ISO C 7.5.

22.5 System error support [syserr]

В этом подпункте описываются компоненты, которые стандартная библиотека и программы C ++ могут использовать для сообщения об ошибках, возникающих из операционной системы или других низкоуровневых прикладных программных интерфейсов.

Компоненты, описанные в этом подпункте, не должны изменять значение errno. Реализации должны оставлять без изменений состояния ошибок, предоставляемые другими библиотеками.

22.5.1 Header <system_­error> synopsis [system_error.syn]

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> макросы.

is_­error_­code_­enum И is_­error_­condition_­enum могут быть специализированы для определенных пользователем типов , чтобы указать , что такие типы имеют право на получение class error_­code и class error_­condition автоматического преобразования, соответственно.

22.5.2 Class error_­category [syserr.errcat]

22.5.2.1 Class error_­category overview [syserr.errcat.overview]

Класс 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;
}

22.5.2.2 Class error_­category virtual members [syserr.errcat.virtuals]

virtual ~error_category();

Effects: Уничтожает объект класса error_­category.

virtual const char* name() const noexcept = 0;

Returns: Строка с названием категории ошибки.

virtual error_condition default_error_condition(int ev) const noexcept;

Returns: error_­condition(ev, *this).

virtual bool equivalent(int code, const error_condition& condition) const noexcept;

Returns: default_­error_­condition(code) == condition.

virtual bool equivalent(const error_code& code, int condition) const noexcept;

Returns: *this == code.category() && code.value() == condition.

virtual string message(int ev) const = 0;

Returns: Строка, описывающая состояние ошибки, обозначенное ev.

22.5.2.3 Class error_­category non-virtual members [syserr.errcat.nonvirtuals]

constexpr error_category() noexcept;

Effects: Создает объект класса error_­category.

bool operator==(const error_category& rhs) const noexcept;

Returns: this == &rhs.

bool operator!=(const error_category& rhs) const noexcept;

Returns: !(*this == rhs).

bool operator<(const error_category& rhs) const noexcept;

Returns: less<const error_­category*>()(this, &rhs).

[ Note: less обеспечивает полный порядок указателей. ] end note

22.5.2.4 Program defined classes derived from error_­category [syserr.errcat.derived]

virtual const char* name() const noexcept = 0;

Returns: Строка с названием категории ошибки.

virtual error_condition default_error_condition(int ev) const noexcept;

Returns: Объект типа error_­condition , соответствующего ev.

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;

Returns: true если для категории ошибки, представленной значком *this, code считается эквивалентным condition; в противном случае false.

22.5.2.5 Error category objects [syserr.errcat.objects]

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

22.5.3 Class error_­code [syserr.errcode]

22.5.3.1 Class error_­code overview [syserr.errcode.overview]

Класс 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);
}

22.5.3.2 Class error_­code constructors [syserr.errcode.constructors]

error_code() noexcept;

Effects: Создает объект типа error_­code.

Postconditions: val_­ == 0 и cat_­ == &system_­category().

error_code(int val, const error_category& cat) noexcept;

Effects: Создает объект типа error_­code.

Postconditions: val_­ == val и cat_­ == &cat.

template <class ErrorCodeEnum> error_code(ErrorCodeEnum e) noexcept;

Effects: Создает объект типа error_­code.

Postconditions: *this == make_­error_­code(e).

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если
is_­error_­code_­enum_­v<ErrorCodeEnum> не true.

22.5.3.3 Class error_­code modifiers [syserr.errcode.modifiers]

void assign(int val, const error_category& cat) noexcept;

Postconditions: val_­ == val и cat_­ == &cat.

template <class ErrorCodeEnum> error_code& operator=(ErrorCodeEnum e) noexcept;

Postconditions: *this == make_­error_­code(e).

Returns: *this.

Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если
is_­error_­code_­enum_­v<ErrorCodeEnum> не true.

void clear() noexcept;

Postconditions: value() == 0 и category() == system_­category().

22.5.3.4 Class error_­code observers [syserr.errcode.observers]

int value() const noexcept;

Returns: val_­.

const error_category& category() const noexcept;

Returns: *cat_­.

error_condition default_error_condition() const noexcept;

Returns: category().default_­error_­condition(value()).

string message() const;

Returns: category().message(value()).

explicit operator bool() const noexcept;

Returns: value() != 0.

22.5.3.5 Class error_­code non-member functions [syserr.errcode.nonmembers]

error_code make_error_code(errc e) noexcept;

Returns: error_­code(static_­cast<int>(e), generic_­category()).

template <class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const error_code& ec);

Effects: Как будто по: os << ec.category().name() << ':' << ec.value();

22.5.4 Class error_­condition [syserr.errcondition]

22.5.4.1 Class error_­condition overview [syserr.errcondition.overview]

Класс 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
  };
}

22.5.4.2 Class error_­condition constructors [syserr.errcondition.constructors]

error_condition() noexcept;

Effects: Создает объект типа error_­condition.

Postconditions: val_­ == 0 и cat_­ == &generic_­category().

error_condition(int val, const error_category& cat) noexcept;

Effects: Создает объект типа error_­condition.

Postconditions: val_­ == val и cat_­ == &cat.

template <class ErrorConditionEnum> error_condition(ErrorConditionEnum e) noexcept;

Effects: Создает объект типа error_­condition.

Postconditions: *this == make_­error_­condition(e).

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если
is_­error_­condition_­enum_­v<ErrorConditionEnum> не true.

22.5.4.3 Class error_­condition modifiers [syserr.errcondition.modifiers]

void assign(int val, const error_category& cat) noexcept;

Postconditions: val_­ == val и cat_­ == &cat.

template <class ErrorConditionEnum> error_condition& operator=(ErrorConditionEnum e) noexcept;

Postconditions: *this == make_­error_­condition(e).

Returns: *this.

Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если
is_­error_­condition_­enum_­v<ErrorConditionEnum> не true.

void clear() noexcept;

Postconditions: value() == 0 и category() == generic_­category().

22.5.4.4 Class error_­condition observers [syserr.errcondition.observers]

int value() const noexcept;

Returns: val_­.

const error_category& category() const noexcept;

Returns: *cat_­.

string message() const;

Returns: category().message(value()).

explicit operator bool() const noexcept;

Returns: value() != 0.

22.5.4.5 Class error_­condition non-member functions [syserr.errcondition.nonmembers]

error_condition make_error_condition(errc e) noexcept;

Returns: error_­condition(static_­cast<int>(e), generic_­category()).

22.5.5 Comparison functions [syserr.compare]

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;

Returns: lhs.category() == rhs.category() && lhs.value() == rhs.value().

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;

Returns: 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; bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept; bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept;

Returns: !(lhs == rhs).

22.5.6 System error hash support [syserr.hash]

template <> struct hash<error_code>; template <> struct hash<error_condition>;

Специализации включены ([unord.hash]).

22.5.7 Class system_­error [syserr.syserr]

22.5.7.1 Class system_­error overview [syserr.syserr.overview]

Класс 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;
  };
}

22.5.7.2 Class system_­error members [syserr.syserr.members]

system_error(error_code ec, const string& what_arg);

Effects: Создает объект класса system_­error.

Postconditions: code() == ec.

string(what()).find(what_­arg) != string​::​npos.

system_error(error_code ec, const char* what_arg);

Effects: Создает объект класса system_­error.

Postconditions: code() == ec.

string(what()).find(what_­arg) != string​::​npos.

system_error(error_code ec);

Effects: Создает объект класса system_­error.

Postconditions: code() == ec.

system_error(int ev, const error_category& ecat, const string& what_arg);

Effects: Создает объект класса system_­error.

Postconditions: code() == error_­code(ev, ecat).

string(what()).find(what_­arg) != string​::​npos.

system_error(int ev, const error_category& ecat, const char* what_arg);

Effects: Создает объект класса system_­error.

Postconditions: code() == error_­code(ev, ecat).

string(what()).find(what_­arg) != string​::​npos.

system_error(int ev, const error_category& ecat);

Effects: Создает объект класса system_­error.

Postconditions: code() == error_­code(ev, ecat).

const error_code& code() const noexcept;

Returns: ec или, при необходимости error_­code(ev, ecat), из конструктора.

const char* what() const noexcept override;

Returns: An НТБ , включающие аргументы в конструкторе.

[ Note: Возвращенный НТБ может быть содержанием what_­arg + ": " + code.message(). ] end note