You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:22:40