Manejo de Excepciones y Módulos en Python

Cuando ocurre un error durante la ejecución de un programa, el intérprete puede detenerse y mostrar un mensaje de error. Esto se conoce como una excepción. Python ofrece mecainsmos robustos para detectar y manejar estos errores, permitiendo depurar y controlar el flujo de ejecución.

Tipos Comunes de Excepciones en Python

Nombre de Excepción Descripción
AttributeError El objeto no tiene el atributo especificado.
OSError Error relacionado con el sistema operativo.
ImportError Fallo al importar un módulo u objeto.
IndexError Índice fuera de rango para una secuencia.
KeyError La clave especificada no se encuentra en el diccionario.
NameError Variable o nombre no definido.
SyntaxError Error en la sintaxis del código Python.
TypeError Operación no válida para el tipo de dato.
ValueError Argumento con un valor inapropiado.
Warning Clase base para las advertencias.

¿Qué es una Excepción?

  • Una excepción es un evento que ocurre durante la ejecución de un programa y que altera su flujo normal.
  • Ocurren cuando Python no puede procesar una instrucción correctamente.
  • Son objetos en Python que representan errores.
  • Si no se capturan, las excepciones provocan la terminación del programa.

Manejo de Excepciones con try/except

El bloque try permite ejecutar código que podría generar una excepción. Si ocurre un error, el bloque except correspondiente se ejecuta para manejarlo.


try:
    # Código que podría generar un error
    pass
except TipoDeError:
    # Código a ejecutar si ocurre el error especificado
    pass

Ejemplo Rápido


try:
    print(variable_no_definida)
except NameError:
    print("Se ha producido un error: la variable no está definida.")

Nota: Si el tipo de excepción que ocurre no coincide con el tipo especificado en el bloque except, la excepción no será capturada y el programa podría terminar.

Captura de Múltiples Excepciones

Se pueden capturar varios tipos de excepciones especificándolos en una tupla:


try:
     resultado = 1 / 0
except (NameError, ZeroDivisionError):
     print("Se ha producido un error de nombre o división por cero.")

Bloque else en try/except

El bloque else se ejecuta si el código dentro del bloque try se completa sin generar ninguna excepción.


try:
    resultado = 10 + 5
except TypeError:
    print("Error de tipo.")
else:
    print(f"La operación se completó con éxito. Resultado: {resultado}")

Bloque finally en try/except

El bloque finally se ejecuta siempre, independientemente de si ocurrió una excepción o no. Es útil para tareas de limpieza, como cerrar archivos.


archivo = None
try:
    archivo = open("mi_archivo.txt", "r")
    print("Archivo abierto para lectura.")
    # Realizar operaciones con el archivo
except FileNotFoundError:
    print("El archivo no se encontró. Creando uno nuevo.")
    archivo = open("mi_archivo.txt", "w")
finally:
    if archivo:
        archivo.close()
        print("El archivo se ha cerrado.")

Creación de Excepciones Personalizadas

Es posible definir tus propias clases de excepción. Estas deben heredar de la clase base Exception e idealmente implementar los métodos __init__ y __str__ para proporcionar detalles sobre el error.

Para lanzar una excepción personalizada, se utiliza la palabra clave raise seguida de una instancia de la clase de excepción.

Ejemplo: Validación de Contraseña

Requerimiento: Lanzar una excepción si la contraseña ingresada tiene menos de 6 craacteres.


class PasswordError(Exception):
    def __init__(self, password_length, min_length):
        self.password_length = password_length
        self.min_length = min_length

    def __str__(self):
        return (f"La contraseña ingresada tiene {self.password_length} caracteres, "
                f"pero debe tener al menos {self.min_length} caracteres.")

def crear_contrasena():
    try:
        contrasena = input("Por favor, ingrese una contraseña (mínimo 6 caracteres): ")
        if len(contrasena) < 6:
            raise PasswordError(len(contrasena), 6)
        else:
            print("Contraseña creada exitosamente.")
    except PasswordError as e:
        print(f"Error: {e}")
    except Exception as e:
        print(f"Ocurrió un error inesperado: {e}")

crear_contrasena()

Módulos en Python

Un módulo es simplemente un archivo Python que contiene definiciones y sentencias. Permite organizar el código y reutilizarlo.

Formas de Importar Módulos

  • import nombre_modulo: Importa el módulo completo. Acceso a sus miembros: nombre_modulo.miembro.
  • from nombre_modulo import miembro: Importa un miembro específico del módulo. Acceso directo: miembro.
  • from nombre_modulo import *: Importa todos los miembros públicos del módulo (usar con precaución).
  • import nombre_modulo as alias: Importa el módulo con un nombre abreviado (alias).
  • from nombre_modulo import miembro as alias: Importa un miembro con un alias.

Módulo time

Proporciona funciones relacionadas con el tiempo.

Obtener la Hora Actual


import time

# Obtiene la hora actual como una tupla de tiempo
tiempo_actual_struct = time.localtime(time.time())
print(tiempo_actual_struct)
# Ejemplo de salida: time.struct_time(tm_year=2023, tm_mon=10, tm_mday=27, tm_hour=10, tm_min=30, tm_sec=0, tm_wday=4, tm_yday=300, tm_isdst=0)

Obtener Tiempo Formateado


import time

# Obtiene la hora actual como una cadena legible
tiempo_actual_legible = time.asctime(time.localtime(time.time()))
print(tiempo_actual_legible)
# Ejemplo de salida: 'Fri Oct 27 10:30:00 2023'

# Formatea la hora actual a un formato específico
tiempo_formateado = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(tiempo_formateado)
# Ejemplo de salida: '2023-10-27 10:30:00'

Símbolos de Formato de Fecha y Hora

  • Año: %y (dos dígitos), %Y (cuatro dígitos)
  • Mes: %m (01-12)
  • Día: %d (01-31)
  • Hora: %H (formato 24h, 00-23), %I (formato 12h, 01-12)
  • Minuto: %M (00-59)
  • Segundo: %S (00-59)

Módulo calendar

Ofrece funciones para generar calendarios.

Obtener el Calendario Mensual


import calendar

# Obtiene el calendario del mes de Septiembre de 2022
calendario_mes = calendar.month(2022, 9)
print(calendario_mes)

Creación de Módulos Propios

Cualquier archivo Python (.py) puede ser un módulo. El nombre del módulo es el nombre del archivo sin la extensión.

Archivo mi_modulo_demo.py


# -*- coding:utf-8 -*-

def sumar(a, b):
    print(f"La suma de {a} y {b} es: {a + b}")

class Calculadora:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def mostrar_suma(self):
        print(f"Suma de instancia: {self.a + self.b}")

# Ejemplo de __all__ para controlar la importación con 'from ... import *'
__all__ = ['sumar']

def funcion_privada_demo():
    print("Esta función no se importará con '*'.")

Uso de Módulos


# Importar el módulo completo
import mi_modulo_demo
mi_modulo_demo.sumar(5, 3)
calc = mi_modulo_demo.Calculadora(10, 20)
calc.mostrar_suma()

# Importar un miembro específico
from mi_modulo_demo import sumar
sumar(7, 2)

# Importar todos los miembros (usando __all__)
from mi_modulo_demo import *
sumar(9, 1)
# funcion_privada_demo() # Esto daría NameError si no está en __all__

Creación de Paquetes

Un paquete es una colección de módulos relacionados organizados en una estructura de directorios. Para que un directorio sea considerado un paquete, debe contener un archivo __init__.py (puede estar vacío).

Estructura de un Paquete


mi_paquete/
├── __init__.py
├── modulo_uno.py
└── modulo_dos.py

Importar desde un Paquete


# Método 1: Importar un módulo específico del paquete
import mi_paquete.modulo_uno
mi_paquete.modulo_uno.funcion_del_modulo_uno()

# Método 2: Importar un miembro específico del módulo
from mi_paquete.modulo_uno import funcion_del_modulo_uno
funcion_del_modulo_uno()

# Método 3: Importar todo desde el paquete (requiere __all__ en __init__.py)
# Contenido de mi_paquete/__init__.py:
# __all__ = ['modulo_uno', 'modulo_dos']

from mi_paquete import *
modulo_uno.otra_funcion() # Asumiendo que modulo_uno está en __all__

El bloque if __name__ == "__main__": se utiliza para asegurar que cierto código solo se ejecute cuando el script es ejecutado directamente, y no cuando es importado como módulo.

Etiquetas: Python excepciones Manejo de errores try-except finally

Publicado el 10-26 13:41