Capturar errores: try/except

flor

Excepción ValueError

               Si lo que deseamos es obtener un dato numérico como respuesta a una instrucción input ( ), deberemos tratar el texto con las correspondientes funciones int(texto) o bien float(texto).

               Pero si introducimos un dato que no puede ser convertido a int (o a float) y le pedimos que lo convierta, se nos mostrará un error de código y el programa se detendrá. Para evitar esto, podemos utilizar el bloque try / except ValueError.

               En el bloque try / except, se ejecuta en primer lugar el código contenido dentro de try:. Si no ocurre ningún error dentro de este código, se pasa por alto lo que contenga el bloque except ValueError: y sigue el programa con normalidad.

               Si existe algún error dentro del bloque try: el flujo se detiene y salta automáticamente dentro del bloque except ValueError: Se ejecuta el código que contenga este segundo bloque y a continuación sigue el programa con normalidad.

correcto=False
while correcto==False:
    try:
        precio=float(input("Introduzca un número decimal: "))
        print("El decimal es correcto")
        correcto=True
    except ValueError:
        print("Por favor, separe los decimales con un punto.") 

Este programa solicita la entrada de un dato, nos pide que sea un número decimal. Este dato se convierte en float y se asigna a la variable precio.

Si no ha habido error al introducir el dato, nos muestra un mensaje informando que el decimal es correcto. A continuación, se asigna el valor “True” a la variable correcto y el programa continúa fuera ya del bloque while.

Si ha habido error al introducir el dato con input (el dato no se puede convertir a float), el programa sigue con el bloque except ValueError (en este caso nos muestra un mensaje del posible error). Después de ejecutarse este segundo bloque el programa puede continuar. Como la variable correcto sigue siendo “False”, se vuelve a ejecutar el bloque while completo.

El bloque while se ejecutará indefinidamente hasta que sea introducido un valor float correcto.

El mismo proceder se puede utilizar si se solicita un dato tipo “int” (entero). Veamos una posible secuencia de ejecución

Introduzca un número decimal: cien
Por favor, separe los decimales con un punto.
Introduzca un número decimal: 10,4
Por favor, separe los decimales con un punto.
Introduzca un número decimal: 432.3
El decimal es correcto

Excepción ZeroDivisionError:

               Además del error anterior, existen otros errores que se pueden producir durante la ejecución del código y que pueden dar lugar a que el programa se detenga. Un error que también es muy común es querer dividir un número entre 0, cosa que matemáticamente no es posible.

Excepción genérica    except:

               También pueden darse otros errores, que pueden ser capturados por la excepción genérica except: (sin más argumentos).

numero=False
while not numero:
    try:
        value = float(input('Introduzca un número distinto de 0 y obtendrá el recíproco: '))
        print('El recíproco de', value, 'es', 1/value)        
        numero=True
    except ValueError:
        print('Compruebe el valor.')    
    except ZeroDivisionError:
        print('No puede ser 0.')    
    except:
        print('Ocurrió un error imprevisto, no especificado.')

En este programa primero asignamos a numero el valor “False”. Después entramos en el bucle:   while not numero:

               Que equivale a decir: mientras que numero sea False…

               Se ejecuta el bloque try:  

               Si el bloque se ejecuta correctamente, se asigna a la variable numero el valor “True” y por tanto se sale a continuación del programa.

               Si se intenta introducir un valor no válido se ejecuta except ValueError, y como no se ha dado el valor “True” a la variable numero se vuelve a ejecutar el bloque inicial:         while not numero:

               Si introducimos el 0, se ejecuta el bloque de error except ZeroDivisionError

               A continuación, añadimos un bloque de error except genérico, por si se produce algún otro tipo de error imprevisto. Si se puede, mejor evitar ponerlo, pero si se pone nos capturaría cualquier tipo de error. El problema de usarlo viene en que se produce el error, pero no sabemos porqué.

               En estos dos últimos casos, también volveríamos al bloque inicial.

               Con todo esto, lo que conseguimos es capturar el error y tratarlo debidamente para evitar que el programa deje de funcionar. Por ejemplo:

Introduzca un número distinto de 0 y obtendrá el recíproco: cinco
Compruebe el valor.
Introduzca un número distinto de 0 y obtendrá el recíproco: 6,7
Compruebe el valor.
Introduzca un número distinto de 0 y obtendrá el recíproco: 0  
No puede ser 0.
Introduzca un número distinto de 0 y obtendrá el recíproco: 6.7
El recíproco de 6.7 es 0.14925373134328357
Iniciocomandos Pythonbloques de código
comentar códigoprint ( )input ( )
captura de erroresCadenasDatos Numéricos
Módulo randomMódulo statisticsDatos Fecha/hora
ConstantesBucles forBucles while
Bloque ifTuplasListas.
match caseConjuntosDiccionarios
FuncionesClasesArchivos
Entorno gráfico TkinterVentanasWidgets básicos