【问题标题】:Better handling of missing/wrong key in boost::program_options更好地处理 boost::program_options 中丢失/错误的键
【发布时间】:2011-04-13 10:42:42
【问题描述】:

当像下面这样的调用失败时,有没有办法知道涉及哪个键?

boost::program_options::variables_map vm;
...
int foo_bar = vm["some_key"].as<int>();

如果地图中缺少密钥,或者无法转换为 int,我会得到一个信息量不大的 bad_any_cast,并且我不知道以下任何内容:

  • 涉及的关键
  • 存储的值,或者即使它存在。
  • 涉及的类型

我找不到任何不涉及修改 boost 标头或将每个对上述内容的调用包装在 try..catch 块中的解决方案。 我认为这是一个常见问题,所以也许其他人知道更好的方法。

【问题讨论】:

  • 我相信文档中提供的示例通常会使用if(vm.count("some_key") != 0) 检查每个选项,所以这似乎是他们打算使用它的方式。
  • 不得不检查每一个键虽然不太理想,但我希望有一个不那么冗长的解决方案。我注意到在最近版本的 boost 中,可以将选项设置为“必需”,从而提高如果缺少密钥,则异常。当然这不适用于可选值,我仍然有处理无效值的问题

标签: c++ boost boost-program-options boost-any


【解决方案1】:

马可,

如果不修改库,就无法获得更好的诊断。

但是,请注意,总的来说,我不确定这种情况下的例外情况是否应该非常详细: - 如果您使用错误的类型来访问变量,则会出现编码错误。您可以使用调试器轻松跟踪 - 如果你访问一个不存在的变量,你要么需要 vm.count,要么使用默认值。同样,这可能是最好使用调试器解决的编码错误。

我同意 bad_any_cast 是可以改进的,但似乎可以报告给用户的异常不应该是这里的目标,其中异常是编码错误的结果。

【讨论】:

  • 感谢您的回答。实际上,我的印象是让用户对选项使用错误的值会引发 bad_any_cast 异常,但事实并非如此。所以是的,在这方面它一定是一个编码错误。不过,我认为可以更好地处理缺失值。
猜你喜欢
  • 2014-05-28
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2018-03-19
  • 1970-01-01
  • 2019-05-01
相关资源
最近更新 更多