2011-10-30 14 views
5

Sto provando a scrivere una funzione che richiede all'utente un numero di cinque cifre, e voglio scrivere un blocco di eccezioni per gestire l'input errato in caso l'utente tenti di inserire una stringa o qualche input non intero.Come si scrive la gestione delle eccezioni per input errati?

So come scrivere un blocco di gestione delle eccezioni per qualcosa come una funzione di divisione in cui si genera un'eccezione per il denominatore che è 0, ma non ho idea di come fare questo per l'input che non ho alcun controllo.

risposta

7

Prima di tutto, in generale, sconsiglio di fare questo: il cattivo input dell'utente è quasi la regola piuttosto che l'eccezione.

Se ti ostini a farlo comunque, si sarebbe probabilmente lo fanno accettando nulla come input, e quindi un'eccezione quando/se non è ciò che si vuole:

// Warning: untested code.  
// Accepting negative numbers left as an exercise for the reader. 
int get_int(std::istream &is) { 
    std::string temp; 

    std::getline(temp, is); 

    for (int i=0; i<temp.size(); i++) 
     if (!isdigit(temp[i])) 
      throw std::domain_error("Bad input"); 
    return atoi(temp); 
} 

ripeto, tuttavia, non penso che sia generalmente una buona idea. Vorrei notare (per un esempio) che gli iostreams già definiscono un bit fail specificamente per situazioni come questa (e il normale operator>> per leggere un int usa quel meccanismo).

+0

Si utilizza 'atoi()' ma si controlla ancora ogni carattere della stringa per non cifre. Perché?? – vsz

+0

Grazie. Per qualche ragione ero bloccato nella mentalità che il mio input doveva essere memorizzato in una variabile intera. Accettare l'input come una stringa e quindi convertirlo risolve il mio problema. – JeramyRR

+0

@vsz: La sua domanda riguardava specificamente il controllo dell'input errato e l'emissione di un'eccezione quando veniva rilevata. Fatto questo, 'atoi' è stato il modo più semplice e veloce per restituire un int. –

0

La soluzione più semplice è leggere una stringa e convertirla in numero intero, ad esempio con atoi. Se ottieni uno zero come risultato, e la tua stringa non era "0", sai che l'input non era numerico, senza bisogno di scorrere la stringa da solo.

+0

Purtroppo ho bisogno di usare 0 per terminare la porzione di input del programma, quindi ho bisogno di sapere quando l'input è veramente 0. – JeramyRR

+0

Puoi controllare separatamente se l'input è veramente 0 o meno. Una discussione più dettagliata può essere trovata su http://stackoverflow.com/questions/1640720/how-do-i-tell-if-the-c-function-ato-failed-or-if-it-was-a- stringa-di-zeri – vsz

0

Le eccezioni sono spesso appropriate quando si accettano dati da un'altra macchina o processo, in cui non vi è motivo di aspettarsi dati non validi all'interno di un flusso di dati altrimenti valido. Per quanto riguarda l'input dell'utente, le eccezioni dovrebbero essere utilizzate solo nei casi che dovrebbero rappresentare un chiaro distacco dal normale flusso del programma. Ad esempio, se un programma ha un'interfaccia in stile tty e una routine che dovrebbe leggere una riga di input ottiene un controllo-C, può essere utile che una tale routine generi un'eccezione. Control-C non dovrebbe necessariamente terminare il programma, ma se il programma si aspetta di leggere diverse righe di input dall'utente, digitando control-C su one dovrebbe spesso saltare il resto.