gpt4 book ai didi

c++ - 如何在 Boost 程序选项中获得更好的错误消息

转载 作者:可可西里 更新时间:2023-11-01 16:39:42 26 4
gpt4 key购买 nike

在下面的代码中,我使用程序选项从命令行或文件中读取参数。此外,可以在运行时通过 ConfigProxy::setConfig

以编程方式设置选项
po::options_description desc("Allowed options");
desc.add_options()
...
("compression", po::value<int>(), "set compression level");

po::variables_map vm;

class ConfigProxy
{
template< typename T>
void setConfig( const std::string key, const T value ){
... // check if the key exists in variable map "vm"

// key exists, set the value
runtimeConfig[key] = po::variable_value( boost::any(value), false);
}

po::variable_value& operator[] (const std::string key) const{
...
// if exists in runtimeConfig return the value in runtimeConfig
// of type program_options::variable_value
...
// else return value in variable map "vm"
}

std::map<std::string, boost::program_options::variable_value> runtimeConfig;
}

通过ConfigProxy,获取选项值

if( vm.count("compression") ){
int value = proxyConfig["compression"].as<int>();
...
}

但是,如果用户提供的“压缩”选项值是错误的类型,例如

configProxy.setConfig("compression", "12" );
...
int value = configProxy["compression"].as<int>(); // was set as string

然后抛出异常

what():  boost::bad_any_cast: failed conversion using boost::any_cast

异常清楚地表明了类型转换问题。但该消息似乎对用户找出错误的哪个选项帮助不大。

有没有更好的方法来通知用户这种类型的错误,而不是抛出 bad_any_cast 异常?

----- 编辑 --------------------------

感谢 Luc Danton 和 Tony,我找到了程序选项如何显示错误。

void validate(boost::any& v,
const std::vector< std::basic_string<charT> >& xs,
T*, long)
{
validators::check_first_occurrence(v);
std::basic_string<charT> s(validators::get_single_string(xs));
try {
v = any(lexical_cast<T>(s));
}
catch(const bad_lexical_cast&) {
boost::throw_exception(invalid_option_value(s));
}
}

我认为,通过实现逻辑,我可以摆脱 bad_any_cast 异常。

最佳答案

你试过吗?

("compression", po::value<int>(), "set compression level");

公告po::value<int>() .您在此处指定关联值的类型为 int .当用户传递 Boost.ProgramOptions 无法转换为 int 的内容时,程序失败并显示错误消息:

error: in option 'compression': invalid option value

毕竟这是图书馆的职责之一。

必须做的原因vm["compression"].as<int>()是因为 compression 的类型在函数调用(括号中的三元组)中指定,在运行时世界中。这不会影响 vm["compression"] 的返回类型,所以它需要一些动态类型的仿真。因此 boost::any_cast_failed查询未指定的类型时出现异常。

关于c++ - 如何在 Boost 程序选项中获得更好的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6281916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com