Manejo de Excepciones en Python

Publicado: sáb, 8 de julio de 2023

Manejo de excepciones en Python
Manejo de excepciones en Python

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.")

Resultado:

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 = int(input("Introduce un número: "))
    resultado = 10 / numero
except ZeroDivisionError:
    print("No se puede dividir por cero.")
except ValueError:
    print("Por favor, introduce un número válido.")

Resultado: (dependiendo de la entrada)

No se puede dividir por cero.

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)

Resultado:

La división fue exitosa, el resultado es: 5.0

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.")

Resultado:

El archivo no fue encontrado.

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)

Resultado:

La edad no puede ser negativa.

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)

Resultado:

Error: can only concatenate str (not "int") to str list index out of range 'c' invalid literal for int() with base 10: 'a' division by zero 2.0 1.0 unsupported operand type(s) for +: 'int' and 'str' name 'x' is not defined No module named 'modulo_inexistente'

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.



Quieres apoyarme para seguir creando contenido? Puedes invitarme un café (o una cerveza) en mi página de Ko-Fi, es totalmente voluntario y tu ayuda me serviría de mucho para seguir haciendo lo que amo.