std::errc
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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 创建错误码值 (函数) |
为 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) |
保有可移植的错误码 (类) |