2017-03-29 2 views
0

우리는 대규모 프로젝트의 초기 단계에 있고 초기 작업 중 하나는 다른 모듈을 오류 코드로 정의하는 것입니다. 이전에는 errno 시스템을 오류 코드로 사용하고 strerror()를 사용하여 오류를 인쇄했습니다. 이것은 매우 간단하고 잘 작동합니다. 우리의 초기 코드의 대부분은 C가 10 % C++ 일 수 있습니다.C++ 사용자 정의 오류 코드 클래스 또는 시스템 오류 번호

[완전히 C++로] 새 프로젝트에서 우리가 바로 따라하면 혼란 스럽습니다. 또는 자체 오류 클래스를 정의하십시오.

예 :

이 일부 C++ 설탕 단지 래퍼 클래스입니다
enum class ErrorCode { 

FILE_EXIST = EEXIST, 
ACCESS_DENIED = EACCESS, 
... 
}; 

const char *error_str (ErrorCode code) 
{ 
    switch (code) { 
     case ACCESS_DENIED: return "Access denied"; 
     ... 
    } 
} 

class Error { 
    Error (ErrorCode code) : _code (code){} 
    Error() : _code(0){} 

    void operator = (ErrorCode code); 
    bool operator == (ErrorCode code); 
    operator bool() {return _code != 0;} 
    const char *string() { return error_str(_code);} 

private: 
    ErrorCode _code; 
}; 

. 그러나 이것을 정의한 후에는 확장 가능성이 아니라 int/strerror()에 값을 추가하지 않고 불필요하게 장황하게 만듭니다. 나는 위의 doesnt가 ​​단지 그것 안에 int를 가지고 있기 때문에 errno에 비해 너무 많은 성능 패널티를 추가하지 않는다고 생각한다.

큰 도움이 필요하십니까? - 큰 C++ 프로젝트 경험으로, 어떻게 되었습니까?

+0

예외가 아닌 이유는 무엇입니까? – kreuzerkrieg

+0

예외 예 ..하지만 오류 코드 – MGH

+1

을 사용해야하는 경우 이전에는 C++ 서버를 다시 작성하고 코드를 반환하는 API를 사용할 때 예외로 변환했습니다. 예를 들어 Win32 API의 경우 'FormatMessageA'를 사용하여 오류 설명을 가져온 다음 Win32Exception을'class Win32Exception : public std :: runtime_error'로 정의하고 Base를 FormatMessageA에서 검색 한 오류 설명으로 초기화했습니다. – kreuzerkrieg

답변

0

std::error_codesystem_error에서 살펴보고 원하는대로하는 것으로 보입니다. This은 어떻게 작동하는지에 대한 좋은 자습서입니다. This 게시물은 어떻게 작동하는지 자세히 설명합니다.