std::errc(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME πŸ’–

okay bestie, welcome to the std::errc(3) page. The NAME is literally std::errc β€” that's the main character, no cap. πŸ’…

🌸 Synopsis 🌸

Defined in header <system_error>:

enum class errc;                  (since C++11)

The scoped enumeration std::errc defines the values of portable error conditions that correspond to the POSIX error codes. It's giving "glow-up for errno," fr fr. ✨

πŸŽ€ Member constants πŸŽ€

Each constant pairs a cute C++ name with its equivalent POSIX error code β€” here's the whole roster, zero skips:

  • 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 (deprecated) β€” ENODATA
  • no_message β€” ENOMSG
  • no_protocol_option β€” ENOPROTOOPT
  • no_space_on_device β€” ENOSPC
  • no_stream_resources (deprecated) β€” 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 (deprecated) β€” 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 (deprecated) β€” 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

✨ Non-member functions ✨

  • make_error_code(std::errc) β€” creates error code value for errc enum e (C++11) (function)
  • make_error_condition(std::errc) β€” creates an error condition for an errc value e (C++11) (function)

πŸ¦‹ Helper classes πŸ¦‹

  • is_error_condition_enum<std::errc> β€” extends the type trait std::is_error_condition_enum to identify errc values as error conditions (C++11) (function template)

πŸ”₯ Example πŸ”₯

// Run this code

        #include <filesystem>
        #include <fstream>
        #include <iomanip>
        #include <iostream>
        #include <string>
        #include <system_error>
        #include <thread>

        void print_error(const std::string& details, std::error_code
       error_code)
        {
            std::string value_name;
            if (error_code == std::errc::invalid_argument)
                value_name = "std::errc::invalid_argument";
            if (error_code == std::errc::no_such_file_or_directory)
                value_name = "std::errc::no_such_file_or_directory";
            if (error_code == std::errc::is_a_directory)
                value_name = "std::errc::is_a_directory";
            if (error_code == std::errc::permission_denied)
                value_name = "std::errc::permission_denied";

            std::cout << details << ":\n  "
                      << std::quoted(error_code.message())
                      << " (" << value_name << ")\n\n";
        }

        void print_errno(const std::string& details, int errno_value = errno)
        {
            print_error(details, std::make_error_code(std::errc(errno_value)));
        }

        int main()
        {
            std::cout << "Detaching a not-a-thread...\n";
            try
            {
                std::thread().detach();
            }
            catch (const std::system_error& e)
            {
                print_error("Error detaching empty thread", e.code());
            }

            std::cout << "Opening nonexistent file...\n";
            std::ifstream nofile{"nonexistent-file"};
            if (!nofile.is_open())
                print_errno("Error opening nonexistent file for reading");

            std::cout << "Reading from directory as a file...\n";
            std::filesystem::create_directory("dir");
            std::ifstream dir_stream{"dir"};
            [[maybe_unused]] char c = dir_stream.get();
            if (!dir_stream.good())
                print_errno("Error reading data from directory");

            std::cout << "Open read-only file for writing...\n";
            std::fstream{"readonly-file", std::ios::out};
            std::filesystem::permissions("readonly-file",
       std::filesystem::perms::owner_read);
            std::fstream write_readonly("readonly-file", std::ios::out);
            if (!write_readonly.is_open())
                print_errno("Error opening read-only file for writing");
        }

🌈 Possible output 🌈

        Detaching a not-a-thread...
        Error detaching empty thread:
          "Invalid argument" (std::errc::invalid_argument)

        Opening nonexistent file...
        Error opening nonexistent file for reading:
          "No such file or directory" (std::errc::no_such_file_or_directory)

        Reading from directory as a file...
        Error reading data from directory:
          "Is a directory" (std::errc::is_a_directory)

        Open read-only file for writing...
        Error opening read-only file for writing:
          "Permission denied" (std::errc::permission_denied)

πŸ’€ Defect reports πŸ’€

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

  • DR LWG 3869 β€” applied to C++11.
    • Behavior as published: the member constants no_message_available, no_stream_resources, not_a_stream and stream_timeout referred to the obsolete POSIX STREAMS API [1].
    • Correct behavior: deprecated them.
  1. ↑ Although the corresponding POSIX error numbers ENODATA, ENOSR, ENOSTR and ETIME were marked "obsolescent" in POSIX 2017, the STREAMS API was optional and not required for conformance to the previous POSIX standard (because popular unix-like systems refused to implement it).

🫢 See also 🫢

  • error_code β€” holds a platform-dependent error code (C++11) (class)
  • error_condition β€” holds a portable error code (C++11) (class)

okay that's the whole page, bestie! source/version: http://cppreference.com β€” date: 2024.06.10 πŸ’–βœ¨

πŸ“¦ where this page comes from