Manejo de Excepciones en Python: Guía Completa con Ejemplos

1. Introducción al manejo de excepciones en Python

¿Qué es el manejo de excepciones en Python?

Durante la ejecución de un programa, pueden ocurrir errores inesperados. A estos se les llama excepciones, y cuando ocurren normalmente el programa se detiene. En Python, existe un mecanismo llamado manejo de excepciones que permite controlar estos casos. Con él, el programa puede responder adecuadamente a los errores y continuar funcionando.

¿Por qué es importante el manejo de excepciones?

El manejo de excepciones es esencial para que un programa siga siendo fácil de usar incluso cuando enfrenta errores. Además, ayuda a identificar la causa del problema y facilita la depuración, lo que permite crear programas más confiables.

2. ¿Qué es la sentencia try-except?

Sintaxis básica

La sentencia try-except en Python permite escribir en el bloque try el código que podría generar un error, y definir en el bloque except cómo manejarlo. La sintaxis básica es la siguiente:
try:
    # Código que podría generar un error
except SomeError:
    # Código para manejar el error
Si el código dentro del bloque try se ejecuta sin problemas, el bloque except será ignorado. Sin embargo, si ocurre un error, se ejecutará la acción definida para esa excepción.

Ejemplo común: error de división por cero

Al intentar dividir entre cero, se genera un ZeroDivisionError. Este error puede manejarse de la siguiente forma:
try:
    result = 10 / 0
except ZeroDivisionError:
    print("No es posible dividir entre cero")
 
侍エンジニア塾

3. Excepciones comunes y cómo manejarlas

1. ZeroDivisionError

Esta excepción ocurre cuando se intenta dividir un número entre cero. Por ejemplo:
try:
    result = 10 / 0
except ZeroDivisionError:
    print("No es posible dividir entre cero")

2. ValueError

El ValueError ocurre cuando se proporciona un valor inapropiado a una función u operación. En este ejemplo, se intenta convertir a entero una cadena no numérica:
try:
    num = int("not_a_number")
except ValueError:
    print("Valor inválido")

3. Manejo de múltiples excepciones

Cuando es necesario manejar varias excepciones al mismo tiempo, se pueden agrupar dentro de un mismo bloque except:
try:
    result = 10 / "string"
except (ZeroDivisionError, TypeError):
    print("Se produjo un error")

4. Obtener detalles del error con objetos de excepción

Uso de as para capturar el objeto de excepción

Con la palabra clave as es posible capturar el objeto de excepción y acceder a información detallada del error, útil para mostrar o registrar en logs:
try:
    a = 10 / 0
except ZeroDivisionError as e:
    print(f"Se produjo un error: {e}")
En este caso, la variable e almacena el mensaje del error para poder mostrarlo.
侍エンジニア塾

5. Uso del bloque finally

¿Qué es finally?

El bloque finally se ejecuta siempre, ocurra o no una excepción. Es especialmente útil para liberar recursos, como cerrar archivos o desconectar bases de datos.
try:
    file = open("test.txt", "r")
except FileNotFoundError:
    print("Archivo no encontrado")
finally:
    print("Finalizando operación con el archivo")

Liberación de recursos

finally es muy útil para garantizar la liberación de recursos. Por ejemplo, cerrar un archivo de forma segura:
try:
    file = open("data.txt", "r")
    # Operaciones con el archivo
finally:
    file.close()
De esta forma, el archivo se cerrará siempre, aunque ocurra un error.

6. Generar excepciones manualmente con raise

¿Cuál es el propósito de raise?

La sentencia raise permite lanzar excepciones de forma intencional. Esto es útil para validar entradas o forzar condiciones específicas.
def check_value(value):
    if value < 0:
        raise ValueError("No se permiten valores negativos")

Ejemplo de excepción personalizada

Generar excepciones en condiciones específicas ayuda a evitar comportamientos inesperados y mejorar la seguridad del programa.

7. Buenas prácticas en el manejo de excepciones en Python

1. Evitar el uso excesivo de excepciones

El abuso del manejo de excepciones puede dificultar la lectura del código y la depuración. Se recomienda usarlas solo en los casos donde realmente sean necesarias.

2. Registrar los errores en logs

Es recomendable registrar los mensajes de error con un sistema de logs. Esto facilita el análisis posterior de los problemas. Ejemplo con el módulo logging:
import logging

try:
    a = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"Se produjo un error: {e}")

3. Evitar el uso de except demasiado general

Siempre es mejor capturar excepciones específicas. El uso de except Exception de forma general puede ocultar detalles importantes del error. En su lugar, maneja cada excepción de manera individual.
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール