2011-10-30 12 views
5

Estoy intentando escribir una función que solicite un número de cinco dígitos para un usuario, y quiero escribir un bloque de excepción para manejar una entrada incorrecta en caso de que el usuario intente ingresar una cadena o alguna entrada no entera.¿Cómo escribo el manejo de excepciones para entradas incorrectas?

Sé cómo escribir un bloque de manejo de excepciones para algo así como una función de división donde se lanza una excepción para el denominador que es 0, pero no tengo ni idea de cómo hacer esto para la entrada que no tengo control.

Respuesta

7

En primer lugar, generalmente desaconsejo esto: la mala información del usuario es casi la regla y no la excepción.

Si insiste en hacer de todos modos, es probable que lo haría mediante la aceptación de nada como entrada, y luego lanzar una excepción cuando/si no es lo que quiere:

// 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); 
} 

repito, sin embargo, no creo que esto sea generalmente una buena idea. Me gustaría señalar (por ejemplo) que iostreams ya define un bit fail específicamente para situaciones como esta (y el operator>> normal para leer un int usa ese mecanismo).

+0

Utiliza 'atoi()' pero aun así verifica cada carácter de la cadena para los que no son dígitos. ¿¿Por qué?? – vsz

+0

Gracias. Por alguna razón, estaba atrapado en la mentalidad de que mi entrada tenía que estar almacenada en una variable entera. Aceptar la entrada como una cadena y luego convertirla resuelve mi problema. – JeramyRR

+0

@vsz: Su pregunta era específicamente sobre la comprobación de entrada incorrecta y lanzar una excepción cuando se encontró. Habiendo hecho eso, 'atoi' era la forma más rápida y fácil de devolver un int. –

0

La solución más sencilla es leer una cadena y convertirla en un entero, por ejemplo con atoi. Si obtienes un cero como resultado y tu cadena no era "0", sabes que la entrada no era numérica, sin necesidad de recorrer la cadena por ti mismo.

+0

Lamentablemente necesito usar 0 para terminar la parte de entrada del programa, así que necesito saber cuándo la entrada es realmente 0. – JeramyRR

+0

Puede verificar por separado si la entrada es realmente 0 o no. Se puede encontrar una discusión más detallada en http://stackoverflow.com/questions/1640720/how-do-i-tell-if-the-c-function-atoi-failed-or-if-it-was-a- cadena de ceros – vsz

0

Las excepciones son a menudo apropiada al aceptar datos de otra máquina o proceso, donde no hay razón para esperar que los datos no válidos que se produzca dentro de un flujo de datos de otro modo válido. Con respecto a la entrada del usuario, las excepciones solo deberían usarse en casos que deberían representar una desviación clara del flujo normal del programa. Por ejemplo, si un programa tiene una interfaz de estilo tty y una rutina que se supone que debe leer una línea de entrada obtiene un control C, puede ser útil que dicha rutina genere una excepción. El control-C no necesariamente debe finalizar el programa, pero si el programa espera leer varias líneas de entrada del usuario, escribir control-C a la vez debería hacer que el resto se omita.