El manejo de excepciones es un componente crítico de la programación robusta en Python. Permite gestionar con elegancia los errores que puedan surgir durante la ejecución del programa, previniendo bloqueos y proporcionando a los usuarios información útil. Este tutorial profundiza en los conceptos fundamentales del manejo de excepciones en Python.
Tabla de Contenidos
- try…except
- raise Exception
- try…finally
- Excepciones Integradas Comunes
- Creando Excepciones Personalizadas
1. try…except
El bloque try...except
es la base del manejo de excepciones. El código que pueda generar una excepción se coloca dentro del bloque try
. Si ocurre una excepción, se ejecuta el bloque except
correspondiente.
try:
result = 10 / 0 # Esto generará un ZeroDivisionError
except ZeroDivisionError:
print("Error: ¡División por cero!")
except TypeError:
print("Error: Falta de coincidencia de tipo")
except Exception as e: # Captura cualquier otra excepción
print(f"Ocurrió un error inesperado: {e}")
else: # Bloque else opcional, se ejecuta si no ocurre ninguna excepción
print(f"Resultado: {result}")
finally: # Bloque finally opcional, siempre se ejecuta
print("Esto siempre se ejecuta.")
Este ejemplo demuestra cómo manejar un ZeroDivisionError
. Se pueden usar múltiples bloques except
para manejar diferentes tipos de excepciones. El bloque else
opcional se ejecuta solo si no ocurre ninguna excepción en el bloque try
. El bloque finally
, también opcional, siempre se ejecuta, ideal para tareas de limpieza como el cierre de archivos.
2. raise Exception
La sentencia raise
permite generar excepciones explícitamente, señalando errores o condiciones excepcionales.
def validate_age(age):
if age < 0:
raise ValueError("La edad no puede ser negativa")
elif age > 120:
raise ValueError("La edad es irrealmente alta")
return age
try:
age = validate_age(-5)
print(f"Edad válida: {age}")
except ValueError as e:
print(f"Error: {e}")
Aquí, validate_age
genera un ValueError
si la edad es inválida. Puedes generar cualquier excepción integrada o crear las tuyas propias (clases que heredan de Exception
).
3. try…finally
El bloque finally
asegura que el código dentro de él siempre se ejecute, independientemente de las excepciones. Es esencial para la limpieza.
file = None
try:
file = open("my_file.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("¡Archivo no encontrado!")
finally:
if file:
file.close()
print("Archivo cerrado.")
Esto garantiza que el archivo se cierre incluso si ocurre un FileNotFoundError
, previniendo fugas de recursos.
4. Excepciones Integradas Comunes
Python ofrece numerosas excepciones integradas:
ZeroDivisionError
: División por cero.TypeError
: Tipo inapropiado para una operación.ValueError
: Tipo correcto, valor inapropiado.FileNotFoundError
: Archivo no encontrado.IndexError
: Índice fuera de rango.KeyError
: Clave no encontrada en un diccionario.ImportError
: Error de importación.NameError
: Nombre no encontrado.
5. Creando Excepciones Personalizadas
Para un manejo de errores más específico, crea excepciones personalizadas subclasificando la clase Exception
:
class InvalidInputError(Exception):
pass
def process_data(data):
if not data:
raise InvalidInputError("Los datos no pueden estar vacíos")
# ...resto del procesamiento de datos...
try:
process_data("")
except InvalidInputError as e:
print(f"Error Personalizado: {e}")
Esto permite un manejo de errores más granular y una mejor legibilidad del código.
El manejo efectivo de excepciones es vital para escribir programas Python robustos y fiables. Al anticipar y manejar con elegancia los errores potenciales, se crean aplicaciones más resistentes y fáciles de usar.