Лучшая обработка отсутствующего / неправильного ключа в 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 - это то, что можно улучшить, но не похоже, что исключение, о котором можно сообщить пользователю, должно быть целью здесь, где исключения являются результатом ошибки кодирования.