2011-04-13 3 views
5

다음과 같은 호출이 실패 할 때 어떤 키가 관련되었는지 알 수있는 방법이 있습니까? boost :: program_options의 missing/wrong key 처리 개선

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

마르코,

라이브러리를 수정하지 않고 더 나은 진단을받을 수있는 방법이 없습니다.

그러나 일반적으로이 경우의 예외 사항은 매우 상세해야합니다. - 잘못된 유형을 사용하여 변수에 액세스하면 코딩 오류가 발생합니다. 디버거를 사용하여 쉽게 추적 할 수 있습니다. - 존재하지 않는 변수에 액세스하는 경우 vm.count 인 경우 필요하거나 기본값을 사용하십시오. 다시 말하지만, 아마도 디버거를 사용하여 가장 잘 코딩 된 오류 일 것입니다.

bad_any_cast가 개선 될 수있는 것에 동의하지만, 사용자에게보고 할 수있는 예외는 여기서 목표가되어야합니다. 여기서 예외는 코딩 오류의 결과입니다.

+0

당신이 대답 주셔서 감사합니다. 사실 나는 옵션에 대해 잘못된 값을 사용하는 사용자가 bad_any_cast 예외를 throw한다는 인상 아래에 있었지만 그렇지 않습니다. 그래서 그렇습니다. 그 점에서 코딩 오류 여야합니다. 아직도, 나는 가치가 없어 졌다고 생각한다. –