2014-01-10 8 views
11

C에서 '부스트 :: 시스템 : ERROR_CODE을'++ 사용 :나는 다음과 같은 코드를 가지고

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

뭔가 잘못 때, 나는 errcode가 오류의 특성을 나타내는 것으로 추정한다. 그러나, 뭔가 잘못되었다는 것을 알 때, errcode은 도움이되지 않는 0을 유지한다는 것을 알게되었습니다. 내가 의도적으로 폴더 이름 widePath에 잘못된 문자 (???)를 도입하여 오류가 발생

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

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

:

나는 또한 다른 뭔가를 공개 할 수 있는지 확인하기 위해 errcode를 인쇄했습니다. 결과적으로 나는 system:123이되었습니다. 그게 무슨 뜻 이죠?

+0

글쎄, 당신은 실제로 변수가 범위를 벗어날 때 오류 코드를 확인할 수 없다는 것을 의미합니다. –

+0

아마도. 그러나 나는 그것을 바꿀 수 있었다. 이 error_code 비즈니스가 현재 어떻게 작동하는지 테스트 해보십시오. – Boehmi

+0

동일한 범위에서 여러 개의 반환을 피하십시오. 더 자세히 설명 된 것처럼 errcode.value()를 살펴보십시오. –

답변

14

그냥 방문 : 또한 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 
}; 

: ASIO에서

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로 사용할 수 있습니다

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

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

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

저는 약간 혼란스러워서 대문자를 사용하지 않고 대신 일부 숫자 만 돌려 보았습니다. 그렇다면 나는 error.message()로 무엇이 계속되었는지 알게되었고 모든 것이 올바르게되었다. :) – Boehmi

2

오류 코드는 부울로도 사용할 수 있습니다 직접 오류가있는 열거 형 :

,451,515,
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

관련 문제