85 - Excepciones estándar de Python

Python provee un conjunto de excepciones por defecto que podemos hace uso en nuestros programas.

Ver video

Algunas de las excepciones más comunes que podemos utilizar son:

  • ValueError: Se genera cuando una operación o función recibe un argumento que tiene un valor inapropiado como vimos en el concepto anterior al tratar de convertir un string a entero siendo que el string no contiene valores numéricos.

  • IndexError: Se genera cuando un subíndice de una secuencia (tupla, lista, string) está fuera de rango. Por ejemplo en una lista de 5 elementos queremos acceder al elemento con subíndice 70.

    excepción IndexError de python

  • NameError: Se genera cuando llamamos a una función, método o tratamos de acceder a una variable inexistente.

    excepción NameError de python

  • TypeError: Se genera cuando una operación o función se aplica a un tipo de dato inapropiado. Por ejemplo si queremos sumar un entero y un string:

    excepción TypeError de python

  • ModuleNotFoundError: Se genera cuando la declaración de un import tiene problemas al intentar cargar el módulo inexistente :

    excepción  ModuleNotFoundError de python

  • ZeroDivisionError: Se genera cuando intentamos dividir una variable o valor por cero:

    excepción  ZeroDivisionError de python

  • OverflowError: Se genera cuando un resultado de una operación aritmética con valores reales (no enteros) es demasiado grande para ser representado:

    excepción OverflowError de python

  • KeyError: Se genera cuando no se encuentra una clave en un diccionario:

    excepción KeyError de python

Un listado completo de las excepciones estándar de Python las puede consultar aquí.

Ejemplos de problemas que capturan excepciones.

Problema:

Realizar la carga de dos números por teclado e imprimir la división del primero respecto al segundo, capturar la excepción ZeroDivisionError.

Programa: ejercicio298.py

try:
    valor1=int(input("Ingrese dividendo:"))
    valor2=int(input("Ingrese divisor:"))
    division=valor1/valor2
    print("El resultado de la división es", division)
except ZeroDivisionError:
    print("No se puede dividir por cero.")

Problema:

Almacenar en una tupla los nombres de meses del año. Solicitar el ingreso del número de mes y mostrar seguidamente el nombre de dicho mes. Capturar la excepción IndexError.

Programa: ejercicio299.py

meses=("enero","febrero","marzo","abril","mayo","junio",
       "julio","agosto","septiembre","octubre","noviembre","diciembre")
try:
    nromes=int(input("Ingrese un número de mes [1-12]:"))
    print(meses[nromes-1])
except IndexError:
    print("En número de mes debe ir entre 1 y 12")

Con este algoritmo si el operador ingresa un valor superior a 12 luego se captura la excepción IndexError. Pero tenemos el problema si carga un valor 0 o inferior a 0 luego las tuplas pueden disponer valores negativos, por lo que estos casos lo podemos resolver con un if:

meses=("enero","febrero","marzo","abril","mayo","junio",
       "julio","agosto","septiembre","octubre","noviembre","diciembre")
try:
    nromes=int(input("Ingrese un número de mes [1-12]:"))
    if nromes>0:
        print(meses[nromes-1])
    else:
        print("En número de mes debe ir entre 1 y 12")
except IndexError:
    print("En número de mes debe ir entre 1 y 12")

Captura de múltiples excepciones con un try.

En un algoritmo se pueden presentar múltiples tipos de excepciones. Veamos la sintaxis para su captura con un ejemplo.

Problema:

Realizar la carga de dos números por teclado e imprimir la división del primero respecto al segundo, capturar las excepciones ZeroDivisionError y ValueError.

Programa: ejercicio300.py

try:
    valor1=int(input("Ingrese dividendo:"))
    valor2=int(input("Ingrese divisor:"))
    division=valor1/valor2
    print("El resultado de la división es", division)
except ZeroDivisionError:
    print("No se puede dividir por cero.")
except ValueError:
    print("Los valores a ingresar deben ser enteros")

Debemos disponer los dos bloques 'except' a la misma altura indicando el nombre de la excepción a capturar:

except ZeroDivisionError:
    print("No se puede dividir por cero.")
except ValueError:
    print("Los valores a ingresar deben ser enteros")

Captura de todas las excepciones sin discriminar el tipo.

En algunas situaciones podemos disponer un bloque try/except sin especificar el o los nombres de las excepciones a capturar.

Problema:

Realizar la carga de dos números por teclado e imprimir la división del primero respecto al segundo. Capturar cualquier tipo de excepción que se dispare.

Programa: ejercicio301.py

try:
    valor1=int(input("Ingrese dividendo:"))
    valor2=int(input("Ingrese divisor:"))
    division=valor1/valor2
    print("El resultado de la división es", division)
except:
    print("Problemas con la entrada u operación")

Como podemos ver no disponemos un nombre de excepción después de la palabra clave 'except':

except:
    print("Problemas con la entrada u operación")

Nuestro algoritmo que responde a cualquier excepción que se dispara siempre será muy general ya que no analizamos en particular que excepción se generó.