84 - Manejo de excepciones en Python

Las excepciones son errores que se disparan durante la ejecución de un programa. En Python podemos dejar que dichas excepciones detengan el programa o en caso contrario escribir un algoritmo para reaccionar a dicha situación.

Los ejemplos más comunes que podemos nombrar de excepciones:

  • Tratar de convertir a entero un string que no contiene valores numéricos.
  • Tratar de dividir por cero.
  • Abrir un archivo de texto inexistente o que se encuentra bloqueado por otra aplicación.
  • Conectar con un servidor de bases de datos que no se encuentra activo.
  • Acceder a subíndices de listas o tuplas inexistentes.
  • Llamada a un método o función inexistente.
  • Importar módulos que no existen.

La captura de excepciones nos permite crear programas mucho más robustos y tolerante a fallas que ocurren en escasas situaciones, pero en caso que se presenten disponemos de un algoritmo alternativo para reaccionar a dicha situación evitando que el programa finalice su ejecución.

Problema:

Realizar la carga de dos números enteros por teclado e imprimir su suma, luego preguntar si quiere seguir sumando valores.
Codificar dos programas uno que capture la excepción de ingreso de datos no numéricos y el otro que no tenga en cuenta el tipo de entrada de datos.

Primero codificaremos sin la captura de excepciones.

Ver video

Programa: ejercicio296.py

while True:
    valor1=int(input("Ingrese primer valor:"))
    valor2=int(input("Ingrese segundo valor:"))
    suma=valor1+valor2
    print("La suma es", suma)
    respuesta=input("Desea ingresar otro par de valores?[s/n]")
    if respuesta=="n":
        break        

Disponemos un while infinito que solo terminará cuando el if contenido dentro del while se verifique verdadero y se ejecute la instrucción break que finaliza inmediatamente el while.

El algoritmo planteado funciona correctamente en casi todos los casos, siempre y cuando el operador ingrese por teclado valores numéricos. En el caso que el operador ingrese un valor no numérico el programa se interrumpe mostrando la excepción generada:

excepción de python

Como podemos comprobar el programa finaliza si ingresamos la cadena 'juan' en lugar de un número. Es un tipo de error que según el tipo de programa que estamos desarrollando capturaremos ésta excepción, por ejemplo si es un pequeño script que utilizaremos nosotros mismos es posible que este algoritmo nos alcance y tengamos cuidado de cargar siempre valores enteros por teclado.

Pero que pasa si el programa lo utilizará otro usuario que no tenga cuidado en la entrada de datos, podemos modificar este programa para que no se interrumpa al ingresar valores no numéricos y le informe con un mensaje que valores están permitidos ingresar por teclado.

Programa: ejercicio297.py

while True:
    try:    
        valor1=int(input("Ingrese primer valor:"))
        valor2=int(input("Ingrese segundo valor:"))
        suma=valor1+valor2
        print("La suma es",suma)
    except ValueError:
        print("debe ingresar números.")
    respuesta=input("Desea ingresar otro par de valores?[s/n]")
    if respuesta=="n":
        break        

En el caso que el operador ingrese un valor no numérico el programa no se interrumpe mostrando la excepción generada sino que se ejecuta un algoritmo alternativo:

excepción de python

Para capturar las excepciones en Python aparecen dos palabras claves nuevas try y except.

El algoritmo principal se dispone dentro del bloque try:

    try:    
        valor1=int(input("Ingrese primer valor:"))
        valor2=int(input("Ingrese segundo valor:"))
        suma=valor1+valor2
        print("La suma es",suma)

Siempre que el operador ingrese valores numéricos solo se ejecuta el bloque del try, pero cuando ingresa un dato no numérico por teclado se genera la excepción 'ValueError' que debe ser capturada luego de la palabra clave except y seguida por el nombre de excepción capturada:

    except ValueError:
        print("debe ingresar números.")

El algoritmo que dispongamos en éste bloque puede hacer cualquier cosa, en este caso solo informar al operador que debe ingresar solo números.

Luego de ejecutar el bloque 'except' continúa el programa activo con las instrucciones siguiente sin su interrupción.