4

我已经用 C++ 为外围设备编写了一个驱动程序,简而言之,在交互过程中可能会出现许多错误。我已经为所有可能的错误定义了错误代码。我想写一个方法,让用户能够查询错误代码的含义。

请记住,我总共有 17 个可能的错误。相应的消息具有不同的长度。

我已经用一个接受错误代码并返回带有错误消息的字符串的函数解决了它。该函数使用错误代码循环通过一个 switch case 例程,每个 case 返回不同的错误消息,如下所示。

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

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

4

5 回答 5

4

如果你的错误数不大,使用表效率更高

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

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

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

于 2013-10-29T15:18:03.983 回答
4

您可以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.";
}
于 2013-10-29T15:19:46.187 回答
3

如果您的错误代码很少,则交换机可能是最好的解决方案。但是,如果您可以使它们变得密集,那么您可以将错误消息放在一个表中并使用错误代码对其进行索引。

于 2013-10-29T15:17:17.123 回答
2

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

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)
{
    auto i = error_codes.find(e);
    if( i != error_codes.end() )
    {
        //error was found
        return (*i).second;
    }
    else
    {
        return "Unknown error";
    }
}
于 2013-10-29T15:19:12.413 回答
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";
    }
}
于 2013-10-29T15:35:01.023 回答