El manejo de excepciones es una parte crucial de la programación, permitiéndonos anticipar y gestionar errores que pueden ocurrir durante la ejecución de un programa. Python proporciona un marco robusto para manejar excepciones, lo que nos permite escribir código más seguro y fiable.
¿Qué es una Excepción?
Una excepción es un evento que ocurre durante la ejecución de un programa y que interrumpe el flujo normal de las instrucciones. Esto podría deberse a una variedad de razones, como errores de sintaxis, errores de lógica, o problemas imprevistos como archivos faltantes o problemas de red.
Manejo Básico de Excepciones
En Python, usamos las sentencias try
y except
para manejar excepciones. El bloque try
contiene el código que podría lanzar una excepción, y el bloque except
contiene el código que se ejecutará si ocurre una excepción.
# Intentar dividir por cero y manejar la excepción
try:
resultado = 10 / 0
except ZeroDivisionError:
print("No se puede dividir por cero.")
Múltiples Excepciones
Podemos manejar múltiples excepciones utilizando múltiples bloques except
. Cada bloque except
puede manejar un tipo específico de excepción.
# Manejar múltiples excepciones
try:
numero = 0
resultado = 10 / numero
except ZeroDivisionError:
print("No se puede dividir por cero.")
except ValueError:
print("Por favor, introduce un número válido.")
El Bloque else
El bloque else
se ejecuta si no ocurre ninguna excepción en el bloque try
. Esto es útil para el código que debería ejecutarse si el bloque try
es exitoso.
# Uso del bloque else
try:
resultado = 10 / 2
except ZeroDivisionError:
print("No se puede dividir por cero.")
else:
print("La división fue exitosa, el resultado es:", resultado)
El Bloque finally
El bloque finally
se ejecuta independientemente de si ocurre una excepción o no. Esto es útil para realizar tareas de limpieza, como cerrar archivos o liberar recursos.
# Uso del bloque finally
try:
archivo = open("archivo.txt", "r")
contenido = archivo.read()
except FileNotFoundError:
print("El archivo no fue encontrado.")
finally:
archivo.close()
print("El archivo ha sido cerrado.")
Lanzar Excepciones
También podemos lanzar manualmente excepciones utilizando la sentencia raise
. Esto es útil cuando queremos generar una excepción específica bajo ciertas condiciones.
# Lanzar una excepción manualmente
def verificar_edad(edad):
if edad < 0:
raise ValueError("La edad no puede ser negativa.")
return True
try:
verificar_edad(-1)
except ValueError as e:
print(e)
Excepciones Comunes en Python
La documentación de Python contiene una buena lista de las excepciones integradas y cómo funcionan, pero aquí hay una lista de las más comunes:
- Exception: La clase base para la mayoría de las demás excepciones.
- AttributeError: Se lanza cuando una referencia o asignación de atributo falla.
- IOError: Se lanza cuando una operación de E/S (como una declaración print, la función incorporada open() o un método de un objeto de archivo) falla por una razón relacionada con E/S, por ejemplo, “archivo no encontrado” o “disco lleno”.
- ImportError: Se lanza cuando una declaración import no encuentra la definición del módulo o cuando una declaración from … import no encuentra un nombre que se va a importar.
- IndexError: Se lanza cuando un subíndice de secuencia está fuera de rango.
- KeyError: Se lanza cuando una clave de mapeo (diccionario) no se encuentra en el conjunto de claves existentes.
- KeyboardInterrupt: Se lanza cuando el usuario presiona la tecla de interrupción (normalmente Control-C o Delete).
- NameError: Se lanza cuando un nombre local o global no se encuentra.
- OSError: Se lanza cuando una función devuelve un error relacionado con el sistema.
- SyntaxError: Se lanza cuando el analizador encuentra un error de sintaxis.
- TypeError: Se lanza cuando una operación o función se aplica a un objeto de tipo inapropiado. El valor asociado es una cadena que da detalles sobre la incompatibilidad de tipos.
- ValueError: Se lanza cuando una operación o función incorporada recibe un argumento que tiene el tipo correcto pero un valor inapropiado, y la situación no está descrita por una excepción más precisa como IndexError.
- ZeroDivisionError: Se lanza cuando el segundo argumento de una operación de división o módulo es cero.
# Veamos algunos ejemplos de las excepciones anteriores
# Excepción general
try:
print(sum('1', 2))
except Exception as e:
print(e)
# IndexError
numeros = [1, 2, 3]
try:
print(numeros[3])
except IndexError as e:
print(e)
# KeyError
diccionario = {'a': 1, 'b': 2}
try:
print(diccionario['c'])
except KeyError as e:
print(e)
# ValueError
try:
print(int('a'))
except ValueError as e:
print(e)
# ZeroDivisionError
try:
print(1 / 0)
except ZeroDivisionError as e:
print(e)
# AttributeError
try:
print(1.0.__add__(1))
except AttributeError as e:
print(e)
# AssertionError
try:
assert 1 == 2
except AssertionError as e:
print(e)
# TypeError
try:
print(1 + "1")
except TypeError as e:
print(e)
# NameError
try:
print(x)
except NameError as e:
print(e)
# ImportError
try:
import modulo_inexistente
except ImportError as e:
print(e)
El manejo de excepciones es esencial para construir aplicaciones robustas y confiables. Nos permite anticipar problemas, manejar errores de manera controlada y mantener una buena experiencia de usuario. Es importante siempre pensar en las posibles excepciones que pueden ocurrir y manejarlas adecuadamente.