C ++:异常

时间:2017-04-15 07:01:05

标签: c++ exception enums

我有一个带有以下源代码的C ++应用程序:

    if(!sortedTypedPoints.empty() && sortedTypedPoints[0].type!=PointType::START_VERTEX)
    {
        throw std::runtime_error("First point in the vector should be a start vertex. Point type: " + sortedTypedPoints[0].type);
    }

注意:sortedTypedPoints [0] .type是'enum'。 发生异常时,应用程序将停止,并在控制台中显示不完整的消息:

  

在抛出'std :: runtime_error'

的实例后终止调用      

what():向量中的第一个点应该是一个起始顶点。点类型:

     

中止(核心倾销)

您知道为什么异常消息没有完全显示(第一个单词未完成且未显示枚举值)?

3 个答案:

答案 0 :(得分:1)

您正在调用+上的const char*和整数类型。这只会将字符串的开头向右移动。 如果您有C ++ 11支持,请尝试

".... Point type: " + std::to_string(sortedTypedPoints[0].type)

答案 1 :(得分:0)

您无法在c ++中将枚举连接到字符串。

如果sortedTypedPoints[0].type是枚举,您可以使用to_string添加枚举的数字表示:

throw std::runtime_error("First point in the vector should be a start vertex. "
    "Point type: " + std::to_string(sortedTypedPoints[0].type));

或者,您可以编写自己的函数将枚举转换为字符串:

std::string to_str(PointType type)
{
    switch (type)
    {
    case PointType::START_VERTEX:
        return "START_VERTEX";
    case ...:
        return "...";
    }
    return "unknown";
}

然后使用此功能:

throw std::runtime_error("First point in the vector should be a start vertex. "
    "Point type: " + to_str(sortedTypedPoints[0].type));

您也可以使用C预处理器来帮助您编写to_str函数:

    std::string to_str(PointType type)
    {
#define T(t) if (type==PointType::t) return #t
        T(START_VERTEX);
        T(END_VERTEX);
        T(...);
        return "unknown";
#undef T
    }

答案 2 :(得分:0)

向字符串文字添加整数值不会产生带有连接整数值文本的字符串。它实际上执行指针算术计算,如下所示:

char const * psz_error_message{"First point in the vector should be a start vertex. Point type: "};
throw std::runtime_error(psz_error_message + static_cast< int >(sortedTypedPoints[0].type));

要将枚举值转换为字符串,您需要编写自己的转换函数。如果你抛出异常,最好创建一个拥有type字段的异常类,这样你就可以存储你的排序点类型,以便进一步检查,而不是在抛出时执行字符串格式化。