从YAML读取vector<double>触发YAML::TypedBadConversion错误求助
解决YAML读取std::vector时的TypedBadConversion错误
我刚帮你排查了下这个问题,其实核心问题出在异常捕获的范围和代码执行逻辑上,咱们一步步拆解:
问题根源分析
你当前的代码里,target_jpos = config["target_jpos"].as<std::vector<double> >();这行关键转换代码是放在try-catch块外面的!这会触发两种危险情况:
- 如果文件加载失败(比如路径错误、文件不存在),
config会是一个空的YAML::Node,此时强行访问config["target_jpos"]并尝试类型转换,会直接抛出YAML::TypedBadConversion异常,而这个异常不在try块的捕获范围内,程序自然就崩溃了。 - 就算文件加载成功,万一yaml文件里缺失
target_jpos这个键,同样会触发该转换异常。
另外还有个细节需要注意:你写的文件路径是/config/test.yaml,这是根目录下的绝对路径,如果你的程序不是在系统根目录下运行,这个路径大概率找不到目标文件,改成相对路径./config/test.yaml会更稳妥。
修正后的代码
把转换逻辑也纳入try块内,同时细化异常处理,避免未捕获的崩溃:
bool fileLoaded = false; YAML::Node config; std::vector<double> target_jpos; try { config = YAML::LoadFile("./config/test.yaml"); // 改用项目相对路径 // 将转换操作移入try块,捕获转换类异常 target_jpos = config["target_jpos"].as<std::vector<double> >(); fileLoaded = true; } catch(const YAML::TypedBadConversion<std::vector<double>>& e) { std::cerr << "YAML类型转换错误: " << e.what() << std::endl; fileLoaded = false; } catch(const std::exception& e) { std::cerr << "文件加载错误: " << e.what() << std::endl; fileLoaded = false; } if(fileLoaded) std::cout << "File loaded successfully \n\t target_jpos[0]: " << target_jpos[0] << "\n"; else std::cout << "File failed to load\n";
额外检查点
- 确认yaml-cpp版本:如果使用的是0.5.x及更早的yaml-cpp版本,可能需要手动注册std::vector的转换规则;但你的CMakeLists里直接引入了yaml-cpp源码目录,如果是0.6+的新版本,已经默认支持std::vector的自动转换,这部分无需额外处理。
- 确认yaml文件格式:你的test.yaml数组写法完全正确,无需修改。
- 运行时工作目录:如果是在build子目录下运行编译后的程序,要确保build目录下存在
config/test.yaml(可以通过CMake的文件拷贝规则自动同步,或者手动复制),否则相对路径依然会找不到文件。
内容的提问来源于stack exchange,提问作者HariP19
相关产品推荐
相关产品推荐

