5

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

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

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

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

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

4

1 回答 1

3

马可,

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

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

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

于 2011-04-14T09:30:51.323 回答