2011-04-13 3 views
5

Есть ли способ узнать, какой ключ был задействован, когда вызов, подобный следующему, не работает?Лучшая обработка отсутствующего/неправильного ключа в boost :: program_options

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

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

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

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

+3

Я считаю, что образцы, представленные в документации, обычно проверяют каждую опцию, используя 'if (vm.count (" some_key ")! = 0)', поэтому, похоже, именно так они и предполагали, что они будут использоваться. –

+0

Нужно проверить, что каждый ключ менее идеален, но я надеялся на менее подробное решение. Я заметил, что в последних версиях boost вы можете установить опцию как «обязательную», тем самым создавая исключение, если ключ отсутствует. Конечно, это не будет работать для дополнительных значений, и у меня все еще есть проблема обработки недопустимых значений. –

ответ

3

Marco,

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

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

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

+0

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