std::errc

来自cppreference.com
< cpp‎ | error
 
 
 
 
 
在标头 <system_error> 定义
enum class errc;
(C++11 起)

有作用域枚举 std::errc 定义对应于 POSIX 错误码的可移植错误条件。

成员常量

名称等价的 POSIX 错误
address_family_not_supportedEAFNOSUPPORT
address_in_useEADDRINUSE
address_not_availableEADDRNOTAVAIL
already_connectedEISCONN
argument_list_too_longE2BIG
argument_out_of_domainEDOM
bad_addressEFAULT
bad_file_descriptorEBADF
bad_messageEBADMSG
broken_pipeEPIPE
connection_abortedECONNABORTED
connection_already_in_progressEALREADY
connection_refusedECONNREFUSED
connection_resetECONNRESET
cross_device_linkEXDEV
destination_address_requiredEDESTADDRREQ
device_or_resource_busyEBUSY
directory_not_emptyENOTEMPTY
executable_format_errorENOEXEC
file_existsEEXIST
file_too_largeEFBIG
filename_too_longENAMETOOLONG
function_not_supportedENOSYS
host_unreachableEHOSTUNREACH
identifier_removedEIDRM
illegal_byte_sequenceEILSEQ
inappropriate_io_control_operationENOTTY
interruptedEINTR
invalid_argumentEINVAL
invalid_seekESPIPE
io_errorEIO
is_a_directoryEISDIR
message_sizeEMSGSIZE
network_downENETDOWN
network_resetENETRESET
network_unreachableENETUNREACH
no_buffer_spaceENOBUFS
no_child_processECHILD
no_linkENOLINK
no_lock_availableENOLCK
no_message_available (弃用)ENODATA
no_messageENOMSG
no_protocol_optionENOPROTOOPT
no_space_on_deviceENOSPC
no_stream_resources (弃用)ENOSR
no_such_device_or_addressENXIO
no_such_deviceENODEV
no_such_file_or_directoryENOENT
no_such_processESRCH
not_a_directoryENOTDIR
not_a_socketENOTSOCK
not_a_stream (弃用)ENOSTR
not_connectedENOTCONN
not_enough_memoryENOMEM
not_supportedENOTSUP
operation_canceledECANCELED
operation_in_progressEINPROGRESS
operation_not_permittedEPERM
operation_not_supportedEOPNOTSUPP
operation_would_blockEWOULDBLOCK
owner_deadEOWNERDEAD
permission_deniedEACCES
protocol_errorEPROTO
protocol_not_supportedEPROTONOSUPPORT
read_only_file_systemEROFS
resource_deadlock_would_occurEDEADLK
resource_unavailable_try_againEAGAIN
result_out_of_rangeERANGE
state_not_recoverableENOTRECOVERABLE
stream_timeout (弃用)ETIME
text_file_busyETXTBSY
timed_outETIMEDOUT
too_many_files_open_in_systemENFILE
too_many_files_openEMFILE
too_many_linksEMLINK
too_many_symbolic_link_levelsELOOP
value_too_largeEOVERFLOW
wrong_protocol_typeEPROTOTYPE

非成员函数

errc 枚举 e 创建错误码值
(函数)
errce 创建错误条件
(函数)

辅助类

扩充 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 3869C++11成员常量 no_message_availableno_stream_resources
not_a_streamstream_timeout 涉及了废弃的 POSIX STREAMS API[1]
弃用这些成员常量
  1. 尽管对应的 POSIX 错误码 ENODATA、ENOSR、ENOSTR 和 ETIME 在 POSIX 2017 才被标为“即将废弃”,但以前的 POSIX 标准也不要求必须实现 STREAMS API(因为流行的类 Unix 系统拒绝实现它)。

参阅

保有依赖于平台的错误码
(类)
保有可移植的错误码
(类)