[英]C++ operator() overload boost::system::error_code trick
[英]Using 'boost::system::error_code' in C++
我有以下代碼:
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
結果。 那是什么意思?
只需訪問: 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;
}
錯誤代碼也可以用作布爾值:
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 error enum一起使用:
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;
}
編輯:
但也許,類別存在問題。 對類似問題的回答描述了它: https : //stackoverflow.com/a/23849966/2464169
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.