2011-04-13 11 views
5

次のような呼び出しが失敗したときにどのキーが関連していたかを知る方法はありますか?boost :: program_optionsの欠落/間違ったキーの処理の改善

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

キーがマップから欠落している、またはint型に変換可能でない場合、私はむしろ、情報価値bad_any_castを取得し、私は次のいずれかを知ることはできません。

  • 関与する重要な
  • 保存された値です。
  • 種類は、私はブーストヘッダーを変更するかのtry..catchブロック内に上記のすべての呼び出しをラップのいずれか含まない任意の解決策を見つけることができません

を関与しました。 一般的な問題だと思うので、他の人がもっと良いアプローチを知っているかもしれません。

+3

ドキュメントで提供されているサンプルは、通常、 'if(vm.count(some_key")!= 0) 'を使ってすべてのオプションをチェックすると思います。 –

+0

すべての単一のキーをチェックすることは理想的ではありませんが、私はそれほど冗長な解決策を望んでいませんでした。私は、最近のバージョンのブーストではオプションが "必須"として設定できることに気付きました。もちろん、これはオプションの値では機能しません。無効な値を扱うという問題はまだあります。 –

答えて

3

Marco、

ライブラリを変更せずに診断を行う方法はありません。

しかし、この場合の例外は非常に詳細になるとは思わないことに注意してください。 - 間違った型を使用して変数にアクセスすると、コーディングエラーが発生します。デバッガで簡単にその値を追跡することができます - 存在しない変数にアクセスする場合は、vm.countの場合、またはデフォルト値を使用する必要があります。ここでも、おそらくデバッガを使用して最良に解決されたコーディングエラーです。

私はbad_any_castが改善できるものであることに同意しますが、ユーザーに報告できる例外はここでの目標でなければなりません。例外はコーディングエラーの結果です。

+0

お返事ありがとうございます。実際に私は、ユーザーがオプションに間違った値を使用すると、bad_any_cast例外がスローされるという印象を受けましたが、そうではありません。そう、はい、その点ではコーディングエラーでなければなりません。それでも、欠けている価値をより良く処理できると思います。 –