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

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

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

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

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

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

1 ответ

Решение

Марко,

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

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

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

Другие вопросы по тегам