std::errc
在标头
<system_error> 定义 |
||
enum class errc;
|
(C++11 起) | |
有作用域枚举 std::errc
定义对应于 POSIX 错误码的可移植错误条件。
成员常量
名称 | 等价的 POSIX 错误 |
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 |
非成员函数
(C++11)
|
为 errc 枚举 e 创建错误码值(函数) |
(C++11)
|
为 errc 值 e 创建错误条件(函数) |
辅助类
扩充 std::is_error_condition_enum 类型特性,以鉴别 errc 值为某种错误条件(函数模板) |
示例
#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 << "脱离不是线程的线程...\n"; try { std::thread().detach(); } catch (const std::system_error& e) { print_error("脱离空线程时报错", e.code()); } std::cout << "打开不存在的文件...\n"; std::ifstream nofile{"nonexistent-file"}; if (!nofile.is_open()) print_errno("为读取打开不存在的文件时报错"); std::cout << "将目录当作文件进行读取...\n"; std::filesystem::create_directory("dir"); std::ifstream dir_stream{"dir"}; [[maybe_unused]] char c = dir_stream.get(); if (!dir_stream.good()) print_errno("从目录读取数据时报错"); std::cout << "为写入打开只读文件...\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("为写入打开只读文件时报错"); }
可能的输出:
脱离不是线程的线程... 脱离空线程时报错: "Invalid argument" (std::errc::invalid_argument) 打开不存在的文件... 为读取打开不存在的文件时报错: "No such file or directory" (std::errc::no_such_file_or_directory) 将目录当作文件进行读取... 从目录读取数据时报错: "Is a directory" (std::errc::is_a_directory) 为写入打开只读文件... 为写入打开只读文件时报错: "Permission denied" (std::errc::permission_denied)
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3869 | C++11 | 成员常量 no_message_available 、no_stream_resources 、not_a_stream 和 stream_timeout 涉及了废弃的 POSIX STREAMS API[1] |
弃用这些成员常量 |
- ↑ 尽管对应的 POSIX 错误码 ENODATA、ENOSR、ENOSTR 和 ETIME 在 POSIX 2017 才被标为“即将废弃”,但以前的 POSIX 标准也不要求必须实现 STREAMS API(因为流行的类 Unix 系统拒绝实现它)。
参阅
(C++11)
|
保有依赖于平台的错误码 (类) |
(C++11)
|
保有可移植的错误码 (类) |