Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using 'boost::system::error_code' in C++

I've got the following code:

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

When something goes wrong, I presume that errcode will indicate the nature of the error. However, I'm finding that when I know that something has gone wrong, errcode stays 0 which is not helpful.

I also tried printing errcode to see if it might reveal something different:

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

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

I intentionally caused an error by introducing invalid characters (???) into the folder name widePath. Now I get back system:123 as a result. What does that mean?

like image 360
Boehmi Avatar asked Jan 10 '14 14:01

Boehmi


2 Answers

Just visit: 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
};

furthermore:

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

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

    default: {
        // Assert unexpected case
    }
    break;
}
like image 68
Alex Tape Avatar answered Oct 16 '22 22:10

Alex Tape


Error code can be used also as boolean:

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;
}

Error codes from ASIO can be used with boost asio error enum directly:

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;
}

Edit:

But maybe, there is a problem with categories. This answer to similar question describe it: https://stackoverflow.com/a/23849966/2464169

like image 6
Vizor Avatar answered Oct 16 '22 23:10

Vizor