2013-04-05 2 views
4

저는 C++ 11 표준을 연구 중입니다. 나는 error_code와 errno가 서로 관련이 있는지 알고 싶었다. 그렇다면 어떻게? 그러면 어떤 조건에서 errno가 설정되고 어떤 조건에서 error_code가 설정 될 것으로 예상해야합니까?error_code 대 errno

나는 이것을 이해하기 위해 작은 테스트 프로그램을 만들었지 만 여전히 혼란 스럽다. 도와주세요. 이러한 기능은 예외가 발생하지 C 라이브러리 또는 OS 함수이다 -

#include <iostream> 
#include <system_error> 
#include <thread> 
#include <cstring> 
#include <cerrno> 
#include <cstdio> 

using namespace std; 

int main() 
{ 
    try 
    { 
     thread().detach(); 
    } catch (const system_error & e) { 
     cout<<"Error code value - "<<e.code().value()<<" ; Meaning - "<<e.what()<<endl; 
     cout<<"Error no. - "<<errno<<" ; Meaning - "<<strerror(errno)<<endl; 
    } 
} 

Output - 
Error code value - 22 ; Meaning - Invalid argument 
Error no. - 0 ; Meaning - Success 
+1

제목에 'error_code'라는 제목이 있지만 코드에 언급되지 않았습니다. –

+1

@Keith : e.code() 함수는 value 값을 가진 값을 읽는 error_code의 객체를 반환합니다. – tshah06

답변

6

errno들은 오류가 발생할 부작용으로 문서화하는 것이 그 함수에 의해 사용된다. system_error은 예외를 throw하기 위해 문서화 된 라이브러리 기능을 사용할 때 C++ 표준 라이브러리에서 사용됩니다. 완전히 분리하십시오. 궁극적으로 문서를 읽으십시오!

+0

그래서 error_code를 설정하는 라이브러리 함수가 errno를 사용/설정하지 않는다고 편리하게 말할 수 있습니까? – tshah06

+4

@ tshah06'error_code'는 "설정"되어 있지 않습니다. 이것은'system_error' 예외 속성의 타입 (def)입니다. 그러나 우리는 편리하게'system_error' 예외를 던지는 라이브러리 함수 *가'errno'를 사용/설정하지 않는다고 말할 수 있습니다. 이 이중성은 C++에서 C 함수 ('errno'를 통해 C 스타일 오류 처리를하는)를 호출 할 수 있기 때문에 존재합니다. "순수한"C++ 예외에는 오류 처리 메커니즘이 있으므로 "순수한"C++ 프로그램은 결코 errno를 처리 할 필요가 없습니다. –

+0

@Arne : 의미가 있습니다. 나는 지금 그것에 대해 꽤 분명하다고 생각한다. 감사. – tshah06