如何返回错误消息字符串

时间:2013-10-29 15:12:55

标签: c++ string error-handling

我用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 ;
}

这个功能有效,但它不是一个“漂亮”的解决方案。有没有人对更好的解决方案有任何想法或建议?

5 个答案:

答案 0 :(得分:3)

如果您的错误代码稀疏,那么交换机可能是最好的 解。但是,如果你能让它们变得密集,那么你就可以 只需将错误消息放在表中并使用错误代码即可 索引。

答案 1 :(得分:3)

如果您的错误编号不大,使用表格会更有效

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

您需要进行一些防御性检查,以确保错误编号在范围内。

这就是我记得glibc implments strerror()的方式。

答案 2 :(得分: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.";
}

答案 3 :(得分:1)

如果错误消息已修复,则最好返回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";
    }
}

答案 4 :(得分:0)

您可以使用地图存储错误并在一个地方将其初始化,供所有人查看:

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

勒兹。