2013-10-29 4 views
3

주변 장치에 대해 C++로 드라이버를 작성했으며 요컨대 상호 작용 중에 발생할 수있는 많은 오류가 있습니다. 가능한 모든 오류에 대한 오류 코드를 정의했습니다. 사용자가 오류 코드의 의미를 쿼리 할 수있게하는 메서드를 작성하려고합니다.오류 메시지 문자열을 반환하는 방법

나는 총 17 개의 가능한 오류가 있다는 것을 명심하십시오. 해당 메시지의 길이는 다양합니다.

오류 코드를 받아들이고 오류 메시지와 함께 문자열을 반환하는 함수로 해결했습니다. 이 함수는 오류 코드를 사용하여 각 경우에 다음과 같은 다른 오류 메시지를 반환하는 스위치 사례 루틴을 반복합니다.

std::string getErrorMessage(int errorCode) 
{ 
    std::string errorMessage = "no error" ; 

    switch(errorCode) { 
    case 0: 
     errorMessage = "no error" ; 
     break ; 
    case 10: 
     errorMessage = "there is a network error" ; 
     break ; 
    case 40: 
     errorMessage = "there is a network or protocol error" ; 
     break ; 
    default: 
     errorMessage = "unknown error" ; 
    } 

    return errorMessage ; 
} 

이 기능은 작동하지만 "꽤"해결책은 아닙니다. 누구든지 더 나은 솔루션을위한 아이디어 나 제안이 있습니까?

+1

힌트 : ** ** 정수를 문자열 값에 매핑합니다. – SirDarius

+0

이 문제는 귀하의 문제 중 가장 적은 것으로 보지만 다른 언어에 대한 다양한 오류 메시지와 같은 국제화에 대해 잠시 생각해보십시오. 너무 많은 소프트웨어가 저주를주지는 않는다. – DevSolar

+0

나는 보통이 방법이나 맵을 사용한다. – drescherjm

답변

3

오류 코드가 희박한 경우 스위치가 아마도 가장 좋은 솔루션 일 것입니다. 그러나 밀도를 높일 수 있다면 오류 메시지를 표에 넣고 오류 코드를 색인으로 사용할 수 있습니다. 당신의 오류 번호가 크지 않으면

3

는 테이블을 사용하여

char *error[SIZE] = 
{ 
    [0] = "NO error", 
    [10] = "there is a network error", 
    [40] = "there is a network or protocol error", 
    .... 
} 

당신은 오류 번호가 범위에 있는지 확인하기 위해 몇 가지 방어적인 검사가 필요 더 효율적입니다.

이것은 glibc가 strerror()를 어떻게 불러 와서 불러 낼 수 있는지입니다.

0

iYou는 모든 사람이 볼에 대한 오류를 저장하고 한 장소에 초기화지도를 사용할 수 있습니다

std::map<int,std::string> error_codes; 
void init_codes() 
{ 
    error_codes[1231] = "error 1"; 
    error_codes[121231] = "error 2"; 
    error_codes[131231] = "error 3"; 
    error_codes[135] = "error 4"; 
    error_codes[10] = "error 5"; 
    error_codes[0] = "error 6"; 
} 

std::string get_error(const int e) 
{ 
    std::map<int,std::string>::iterator i = error_codes.find(e); 
    if(i != error_codes.end()) 
    { 
     //error war found 
     return (*i).second; 
    } 
    else 
    { 
     return "Unknown error"; 
    } 
} 

Razvan 보낸 사람을.

+0

부수적으로 오류 코드는 파일에서 읽어 와서지도에 추가 할 수 있습니다 – Raxvan

2

당신은 따라 코드에 매핑 오류 메시지 std::map<int, std::string>을 사용할 수

std::string getErrorMessage(int errorCode) 
{ 
    static std::map<int, std::string> codes; 
    static bool initialized = false; 
    if (!initialized) { 
     codes[0] = "No error."; 
     codes[10] = "Network error."; 
     codes[40] = "Network or protocol error."; 
     initialized = true; 
    } 
    if (codes.count(errorCode) > 0) 
     return codes[errorCode]; 
    return "Unknown error."; 
} 
0

오류 메시지가 고정되어있는 경우, 당신은 const char*를 반환 오프 아마 더 낫다. 훨씬 효율적이며 메모리 할당이 필요하지 않으며 필요한 경우 std::string으로 변환 할 수 있습니다.

const char* getErrorMessage(int errorCode) 
{ 
    switch (errorCode) { 
     case 0: return "no error"; 
     case 10: return "there is a network error"; 
     case 40: return "there is a network or protocol error"; 
     default: return "unknown error"; 
    } 
} 
관련 문제