【问题标题】:Using 'boost::system::error_code' in C++在 C++ 中使用 'boost::system::error_code'
【发布时间】:2014-01-29 13:39:52
【问题描述】:

我有以下代码:

boost::system::error_code errcode;
return (boost::filesystem::create_directories(widePath, errcode));

当出现问题时,我认为errcode 将指示错误的性质。但是,我发现当我知道出现问题时,errcode 保持在 0 没有帮助。

我还尝试打印errcode,看看它是否会揭示一些不同的东西:

boost::system::error_code errcode;
boost::filesystem::create_directories(widePath, errcode);

if (errcode == 0)
    return true;
else
{
    std::cout << errcode;       
    return false;
}

我故意在文件夹名称 widePath 中引入无效字符 (???) 导致了错误。现在我返回system:123 结果。这是什么意思?

【问题讨论】:

  • 直接返回,这意味着你不能真正检查错误代码,因为该变量超出范围。
  • 我猜。但我可以改变这一点。现在只是测试这个 error_code 业务是如何工作的。
  • 避免在同一范围内多次返回.. 看看 errcode.value() 就像我在下面描述的那样

标签: c++ boost error-handling


【解决方案1】:

只需访问:http://www.boost.org/doc/libs/1_55_0/libs/system/doc/reference.html#Header-error_code

enum errc_t {
    success = 0,
    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_synbolic_link_levels,  //ELOOP
    value_too_large,                //EOVERFLOW
    wrong_protocol_type             //EPROTOTYPE
};

进一步:

switch( errcode.value() ) {
    case boost::system::errc::success: {
        // fine
    }
    break;

    case boost::system::errc::operation_canceled: {
        // Timer cancelled
    }
    break;

    default: {
        // Assert unexpected case
    }
    break;
}

【讨论】:

  • 我只是有点困惑,我没有得到这些大写字母,而是一些数字。然后我注意到我知道了 error.message() 发生了什么并且一切正常。 :)
【解决方案2】:

错误码也可以用作布尔值:

boost::asio::io_service ioService;
boost::system::error_code ec;
ioService.run(ec);

if(ec)
{
    std::cout << ec.message() << std::endl;
}
else
{
    std::cout << "There is no error." << std::endl;
}

来自 ASIO 的错误代码可以直接与 boost asio 错误枚举一起使用:

boost::asio::io_service ioService;
boost::system::error_code ec;
ioService.run(ec);

if(ec == boost::asio::error::operation_aborted)
{
    std::cout << ec.message() << std::endl;
}

编辑:

但也许,类别存在问题。 This answer to similar question描述了它:https://stackoverflow.com/a/23849966/2464169

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2012-04-27
    • 2012-08-25
    • 2011-11-28
    相关资源
    最近更新 更多