2013-10-29 13 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"; 
    } 
} 

勒茲萬。

+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"; 
    } 
}