更好地处理boost :: program_options中的丢失/错误键

Mar*_*ele 5 c++ boost boost-program-options boost-any

当下面的呼叫失败时,有没有办法知道涉及哪个密钥?

boost::program_options::variables_map vm;
...
int foo_bar = vm["some_key"].as<int>();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Vla*_*rus 3

马可,

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

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

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