C++ 更好地处理boost::program_选项中缺少/错误的键

C++ 更好地处理boost::program_选项中缺少/错误的键,c++,boost,boost-program-options,boost-any,C++,Boost,Boost Program Options,Boost Any,有没有办法知道在下面这样的调用失败时使用了哪个键 boost::program_options::variables_map vm; ... int foo_bar = vm["some_key"].as<int>(); boost::program\u options::variables\u map vm; ... int foo_bar=vm[“some_key”].as(); 如果映射中缺少密钥,或者无法转换为int,我会得到一个相当没有信息的bad_any_cast,并

有没有办法知道在下面这样的调用失败时使用了哪个键

boost::program_options::variables_map vm;
...
int foo_bar = vm["some_key"].as<int>();
boost::program\u options::variables\u map vm;
...
int foo_bar=vm[“some_key”].as();
如果映射中缺少密钥,或者无法转换为int,我会得到一个相当没有信息的bad_any_cast,并且我无法知道以下任何情况:

  • 涉及的关键
  • 存储的值,或者即使它在那里
  • 涉及的类型
我找不到任何解决方案不涉及修改boost头或在try..catch块中包装对上面的每个调用。 我认为这是一个常见的问题,所以也许其他人知道更好的方法。

马可

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

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


我同意bad_any_cast是可以改进的,但这里的目标似乎不是向用户报告异常,因为异常是编码错误造成的。

我相信文档中提供的示例通常使用
if(vm.count(“some_key”)!=0检查每个选项。
,因此,这似乎是他们打算使用它的方式。虽然必须检查每个键都不太理想,但我希望有一个不太详细的解决方案。我注意到,在boost的最新版本中,可以将选项设置为“必需”,从而在缺少键时引发异常。当然,这对可选值不起作用,我仍然有处理无效值的问题谢谢你的回答。实际上,我的印象是,让用户为选项使用错误的值会抛出bad_any_cast异常,但事实并非如此。因此,是的,在这方面,它一定是一个编码错误。不过,我认为缺失的值可以得到更好的处理。