Python provee un conjunto de excepciones por defecto que podemos hace uso en nuestros programas.
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.
NameError: Se genera cuando llamamos a una función, método o tratamos de acceder a una variable inexistente.
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:
ModuleNotFoundError: Se genera cuando la declaración de un import tiene problemas al intentar cargar el módulo inexistente :
ZeroDivisionError: Se genera cuando intentamos dividir una variable o valor por cero:
OverflowError: Se genera cuando un resultado de una operación aritmética con valores reales (no enteros) es demasiado grande para ser representado:
KeyError: Se genera cuando no se encuentra una clave en un diccionario:
Un listado completo de las excepciones estándar de Python las puede consultar aquí.
Realizar la carga de dos números por teclado e imprimir la división del primero respecto al segundo, capturar la excepción ZeroDivisionError.
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.")
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.
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")
En un algoritmo se pueden presentar múltiples tipos de excepciones. Veamos la sintaxis para su captura con un ejemplo.
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.
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")
En algunas situaciones podemos disponer un bloque try/except sin especificar el o los nombres de las excepciones a capturar.
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.
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ó.