我有一个具有以下源代码的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.type是'enum‘。发生异常时,将停止应用程序,并在控制台中显示不完整的消息:
在引发“std::runtime_error”实例后调用终止 向量中的rst点应该是起始点。点类型: 中止(核心倾弃)
您知道为什么不完全显示异常消息(第一个单词不完整,枚举值没有显示)吗?
发布于 2017-04-14 23:10:23
您正在对一个+
和一个整数类型调用const char*
。这将简单地将您的字符串开始向右移动。如果您有C++11支持,请尝试
".... Point type: " + std::to_string(sortedTypedPoints[0].type)
发布于 2017-04-14 23:13:21
不能将枚举连接到c++中的字符串。
如果sortedTypedPoints[0].type
是enum,则可以使用字符串添加枚举的数字表示形式。
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
}
发布于 2017-04-14 23:17:54
将整数值添加到字符串文本不会产生带有串联整数值文本的字符串。它实际上执行指针算术计算,如下所示:
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
字段的自己的异常类,这样就可以在那里存储排序点的类型,以供进一步检查,而不是在抛出时执行字符串格式设置。
https://stackoverflow.com/questions/43423236
复制相似问题