Python - Control de errores

 
Vista:
Imágen de perfil de Gustavo
Val: 28
Ha disminuido su posición en 17 puestos en Python (en relación al último mes)
Gráfica de Python

Control de errores

Publicado por Gustavo (12 intervenciones) el 28/05/2020 13:51:13
Hola:

Estoy queriendo validar una entrada de un entero en un rango, el rango está medianamente manejado.
El tema es que el usuario ingrese caracteres no numéricos, letras o cadenas.
Intenté try except

1
2
3
4
5
6
7
8
9
10
11
12
valido = True
while valido:
    try:
        num = int(input('Ingrese valor: '))
        if num < 5 or num > 10:
            num = int(input('El valor debe ser entre 5 y 10\nIngrese valor: '))
        else:
            valido = False
    except ValueError:
        num = int(input('Debe ingresar numeros enteros.\nIngrese valor: '))
        valido = False
print(num, 'x 3 =', num*3))

Y funciona bien:

1
2
3
4
5
======== RESTART: C:/... ========
Ingrese valor: seis
Debe ingresar numeros enteros.
Ingrese valor: 6
6 x 3 = 18


Pero consideremos que el usuario es un cretino que se cree que sabe mucho inglés.

1
2
3
4
5
6
7
8
9
10
11
12
13
======== RESTART: C:/... ========
Ingrese valor: seis
Debe ingresar numeros enteros.
Ingrese valor: six
"Traceback (most recent call last):
  File "C:/...", line 4, in <module>
    num = int(input('Ingrese valor: '))
ValueError: invalid literal for int() with base 10: 'seis'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "C:/...", line 10, in <module>
    num = int(input('Debe ingresar numeros enteros.\nIngrese valor: '))
ValueError: invalid literal for int() with base 10: 'six'"

Bien.
Ya sé que estoy manejando una excepción dentro de una excepción, y será así mientras el tonto usuario no entienda.
Alguien podría ayudarme?
Desde ya, muchas gracias por la paciencia y el tiempo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jaime
Val: 398
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Control de errores

Publicado por Jaime (100 intervenciones) el 28/05/2020 14:10:41
Lo que pasa compañero es que el error lanzado no tiene que ver con el idioma, sin importar el idioma, caracter siempre es caracter.
Lo que tienes que hacer es quitar el input de la excepcion y dejar solo un print con los detalles del error y dejar que el ciclo continue, para que vuelva a mostrar la opción de input y volver a validar los datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
valido = True
 
while valido:
 
    try:
 
        num = int(input('Ingrese valor: '))
 
        if num < 5 or num > 10:
 
            num = int(input('El valor debe ser entre 5 y 10\nIngrese valor: '))
 
        else:
 
            valido = False
 
    except ValueError:
 
        num = print ('Debe ingresar numeros enteros.\nIngrese valor: ')
 
        valido = True
 
print(num, 'x 3 =', num*3))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Gustavo
Val: 28
Ha disminuido su posición en 17 puestos en Python (en relación al último mes)
Gráfica de Python

Control de errores

Publicado por Gustavo (12 intervenciones) el 29/05/2020 18:26:00
Lo de los idiomas fue una broma y parece que no tenés mucho sentido del humor.
Lo que quise decir, aunque no lo dije, es que me vuelvan a ingresar caracteres.

El caso es que me diste la solución.

Muchas gracias Jaime.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Gustavo
Val: 28
Ha disminuido su posición en 17 puestos en Python (en relación al último mes)
Gráfica de Python

Control de errores

Publicado por Gustavo (12 intervenciones) el 29/05/2020 19:44:38
De hecho, ya me lo habían dicho y no entendía, pero cuando modificaste mi código, pude verlo.

Tu código, un poco más prolijo, quedó finalmente así:

1
2
3
4
5
6
7
8
9
10
11
no_valido = True
while no_valido:
    try:
        num = float(input('Ingrese valor: '))
        if num < 5 or num > 10:
            print('El valor debe ser entre 5 y 10.')
        else:
            no_valido = False
    except ValueError:
        print ('Debe ingresar numeros.')
print(num, 'x 3 =', num*3)

La salida es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>>
==== RESTART: C:\...Try except.py ====
Ingrese valor: seis
Debe ingresar numeros.
Ingrese valor: six
Debe ingresar numeros.
Ingrese valor: 2
El valor debe ser entre 5 y 10.
Ingrese valor: siete
Debe ingresar numeros.
Ingrese valor: s
Debe ingresar numeros.
Ingrese valor: 99
El valor debe ser entre 5 y 10.
Ingrese valor: dale!
Debe ingresar numeros.
Ingrese valor: 7
7.0 x 3 = 21.0
>>>

Gracias


.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar