我有一个带有以下源代码的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():向量中的第一个点应该是一个起始顶点。点类型:
中止(核心倾销)
您知道为什么异常消息没有完全显示(第一个单词未完成且未显示枚举值)?
答案 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
字段的异常类,这样你就可以存储你的排序点类型,以便进一步检查,而不是在抛出时执行字符串格式化。