已将此版本(版本1.52.0)集成到我的应用中,但如上所述偶然发现了问题。
在附加的示例中,异常what()方法始终仍然保留%canonical_option%标记,并且不会替换为我的选项名称。
我正在使用VS2008,禁用了unicode(选项'none')并从我的项目中删除了所有其他文件,它只是main.cpp文件中的这段代码。
或者我把这一切都搞错了,还有什么我应该调用格式化带有正确参数名称的异常消息?
#include <boost/program_options.hpp>
namespace po = boost::program_options;
using namespace std;
int main(int argc, char* argv[])
{
try {
po::options_description optionalParams("optional");
optionalParams.add_options()
("log_severity,l", po::value<int>()->required(), "Minimum severity logging level")
("log_file,g", po::value<string>(), "Full path to log file")
;
po::variables_map optMap;
po::parsed_options parsed = po::command_line_parser(argc, argv)
.options(optionalParams)
.allow_unregistered()
.run();
po::store(parsed, optMap);
po::notify(optMap);
}
catch(po::error e)
{
cout << e.what();
return 0;
}
return 0;
}
答案 0 :(得分:18)
当我再次查看代码时,在正确浏览了增强代码后,答案变得更加明显。
catch(po::error e)
{
cout << e.what();
return 0;
}
应该是
catch(po::error& e)
{
cout << e.what();
return 0;
}
没有参考,我们得到'对象切片',这里解释得很好:
Catching exceptions by reference
不使用引用意味着我们失去了替换模板的重写'what'方法。
答案 1 :(得分:2)
我只花了一个小时调试这个 - 这实际上是一个有趣的行为 - 我认为你的代码唯一的问题就是你正在捕捉po::error
catch(po::error e)
{
cout << e.what() << std::endl;
return 0;
}
如果您将捕获更改为上面的行
catch(po::required_option e)
{
cout << e.what() << std::endl;
return 0;
}
您将以下内容作为错误消息。
the option '--log_severity' is required but missing
Press any key to continue . . .
所以基本上看起来替换只能在派生的异常中完成。
经过一些阅读后,您实际上可以抓住std::exception
并在拨打what()
时打印出正确的消息。请参阅以下链接了解所有详细信息。
http://www.boost.org/doc/libs/1_52_0/libs/exception/doc/boost-exception.html
我还发现有一种方法可以帮助您诊断抛出异常时发生的事情:
#include <boost/exception/diagnostic_information.hpp>
...
catch(...)
{
std::cerr << "Unhandled exception!" << std::endl <<
boost::current_exception_diagnostic_information();
return 0;
}
例如,如上所述更改程序,它打印出如下所示的内容:
Unhandled exception!
Throw location unknown (consider using BOOST_THROW_EXCEPTION)
Dynamic exception type: class boost::exception_detail::clone_impl<struct
boost::exception_detail::error_info_injector<class
boost::program_options::required_option> >
std::exception::what: the option '--log_severity' is required but missing
Press any key to continue . . .