2011-04-13 12 views
5

C'è un modo per sapere quale chiave è stata coinvolta quando una chiamata come la seguente non riesce?Migliore gestione della chiave mancante/errata in boost :: program_options

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

Se la chiave non è presente la mappa, o non è convertibile a int, ho un bad_any_cast piuttosto uninformative, e non può conoscere uno dei seguenti:

  • la chiave coinvolto
  • il valore memorizzato, o anche se è lì.
  • i tipi coinvolti

non riesco a trovare di qualsiasi soluzione che non comporta né modificare l'intestazione spinta o avvolgere ogni chiamata a quanto sopra in un blocco try..catch. Penso che sia un problema comune, quindi forse qualcun altro conosce un approccio migliore.

+3

Credo che i campioni forniti nella documentazione in genere controllino tutte le opzioni usando 'if (vm.count (" some_key ")! = 0)', quindi sembra che questo sia il modo in cui intendevano utilizzarlo. –

+0

Dovendo controllare che ogni singola chiave sia tutt'altro che ideale, speravo in una soluzione meno prolissa. Ho notato che nelle ultime versioni di boost si può impostare un'opzione come "richiesta", sollevando così un'eccezione se manca la chiave. Ovviamente questo non funzionerà per i valori opzionali, e ho ancora il problema di gestire valori non validi –

risposta

3

Marco,

non c'è modo per ottenere la diagnostica migliori senza modificare la libreria.

Tuttavia, si noti che in generale, non sono sicuro che le eccezioni in questo caso siano molto dettagliate: - Se si utilizza un tipo errato per accedere alla variabile, si è verificato un errore di codifica. Puoi facilmente rintracciarlo con un debugger - Se si accede a una variabile che non esiste, è necessario se è vm.count o utilizzare il valore predefinito. Di nuovo, è probabilmente un errore di codifica risolto meglio usando un debugger.

Sono d'accordo che bad_any_cast è qualcosa che può essere migliorato, ma non sembra che l'eccezione che può essere segnalata all'utente dovrebbe essere un obiettivo qui, dove le eccezioni sono il risultato di un errore di codifica.

+0

Grazie per la tua risposta. In realtà avevo l'impressione che l'utente che utilizzava un valore errato per un'opzione avrebbe lanciato l'eccezione bad_any_cast, ma non è così. Quindi sì, a tale proposito deve essere un errore di codifica. Tuttavia, penso che un valore mancante potrebbe essere gestito meglio. –

Problemi correlati