Лучшая обработка отсутствующего / неправильного ключа в boost :: program_options - PullRequest
5 голосов
/ 13 апреля 2011

Есть ли способ узнать, какой ключ был задействован при сбое вызова, подобного следующему?

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

Если ключ отсутствует на карте или не конвертируется в int, я получаю довольно малоинформативный bad_any_cast и не могу знать ничего из следующего:

  • ключ задействован
  • сохраненное значение, или даже если оно там есть.
  • задействованные типы

Я не могу найти ни одного решения, которое бы не включало ни изменение заголовка повышения, ни упаковку каждого вызова вышеупомянутого в блок try..catch. Я думаю, что это общая проблема, так что, возможно, кто-то другой знает лучший подход.

1 Ответ

3 голосов
/ 14 апреля 2011

Марко,

нет способа улучшить диагностику без изменения библиотеки.

Однако, обратите внимание, что в целом, я не уверен, что исключения в этом случае должны быть оченьподробно: - Если вы используете неправильный тип для доступа к переменной, у вас есть ошибка кодирования.Вы можете легко отследить это с помощью отладчика. Если вы обращаетесь к несуществующей переменной, вам нужно либо использовать vm.count, либо использовать значение по умолчанию.Опять же, это, вероятно, ошибка кодирования, лучше всего решаемая с помощью отладчика.

Я согласен, что bad_any_cast - это то, что можно улучшить, но не похоже, что исключение, о котором можно сообщить пользователю, должно быть целью здесь, гдеисключения являются результатом ошибки кодирования.

...