Entrada

Python 🐍 : Manejo de Errores y Excepciones

Controla los errores en tu código usando try, except, else y finally para hacer tu programa más robusto.

El manejo de errores y excepciones es una parte fundamental en el desarrollo de cualquier software, y Python proporciona una manera eficiente y flexible de gestionar situaciones imprevistas que pueden surgir durante la ejecución de un programa. En este artículo, exploraremos cómo funcionan las excepciones en Python y cómo podemos usarlas para hacer que el código sea más robusto y fácil de depurar.

¿Qué es una Excepción?

En términos sencillos, una excepción es un evento inesperado que interrumpe el flujo normal de ejecución de un programa. En Python, las excepciones se utilizan para manejar errores de forma controlada, permitiendo que el programa no se detenga bruscamente.

Por ejemplo, si intentas dividir por cero, Python lanzará una excepción ZeroDivisionError. En lugar de que el programa se detenga de inmediato, podemos capturar y manejar esa excepción para tomar una acción apropiada, como mostrar un mensaje de error o realizar una operación alternativa.

Estructura Básica de Manejo de Excepciones

En Python, el manejo de excepciones se realiza mediante las palabras claves try, except, y opcionalmente else y finally. Y funciona de la siguiente manera:

flowchart TD
    A([Inicio]) --> B{<font size="6">TRY</font><br>¿Ocurre una excepción?}
    B -- No --> C[<font size="5">ELSE</font><br>Ejecutar bloque de código]
    B -- Sí --> D[<font size="5">EXCEPT</font><br>Capturar excepción]
    C --> E[<font size="5">FINALLY</font><br>Ejecutar bloque finally]
    D --> E
    E --> F([Fin])

Sintaxis Básica

1
2
3
4
5
6
try:
    # Bloque de código que puede causar una excepción
    resultado = 10 / 0
except ZeroDivisionError as e:
    # Bloque que maneja la excepción
    print(f"Error: {e}")

En este ejemplo:

  • El bloque try contiene el código que podría generar una excepción.
  • Si ocurre una excepción, Python salta al bloque except donde puedas manejarla. En este caso, capturamos una excepción de tipo ZeroDivisionError y mostramos un mensaje de error.

Bloque else

El bloque else es opcional y se ejecuta solo si no se ha producido ninguna excepción en el bloque try. Es útil en diferentes contextos para ejecutar código que dependa de que no haya errores.

1
2
3
4
5
6
try:
    x = 10 / 2
except ZeroDivisionError:
    print("No se puede dividir por cero.")
else:
    print(f"La operación fue exitosa: {x}")

En este caso, si no ocurre ninguna excepción en el bloque try, el bloque else se ejecutará, mostrando el resultado de la operación.

Tipos de Excepciones

Python tiene muchas excepciones más, pero esta tabla cubre las más comunes y útiles para el manejo de errores.

ExcepciónDescripción
BaseExceptionLa clase base para todas las excepciones.
ExceptionClase base para todas las excepciones estándar.
ArithmeticErrorClase base para los errores aritméticos, como ZeroDivisionError o OverflowError.
ZeroDivisionErrorSe lanza cuando se intenta dividir un número por cero.
OverflowErrorSe lanza cuando un número excede el límite permitido por el sistema.
ValueErrorSe lanza cuando una operación o función recibe un argumento con un valor inapropiado.
IndexErrorOcurre cuando se intenta acceder a un índice de lista o secuencia fuera de su rango.
KeyErrorSe lanza cuando se intenta acceder a una clave que no existe en un diccionario.
TypeErrorSe lanza cuando una operación o función es aplicada a un objeto de tipo inapropiado.
FileNotFoundErrorOcurre cuando se intenta abrir un archivo que no existe.
IOErrorSe lanza cuando ocurre un error de entrada/salida, como al leer o escribir archivos.
ValueErrorSe lanza cuando se pasa un valor incorrecto a una función.
ImportErrorOcurre cuando un módulo o función no se puede.
ModuleNotFoundErrorSe lanza cuando el módulo solicitado no se puede encontrar.
AttributeErrorSe lanza cuando un objeto no tiene el atributo solicitado.
NameErrorSe lanza cuando se hace referencia a una variable que no está definida.
SyntaxErrorSe lanza cuando hay un error de sintaxis en el código, es decir, cuando el código no sigue las reglas del lenguaje.
IndentationErrorSubclase de SyntaxError que ocurre cuando hay un error de indentación en el código.
AssertionErrorSe lanza cuando una afirmación (assert) falla, es decir, cuando una expresión booleana es falsa.
MemoryErrorOcurre cuando se agota la memoria disponible.
RecursionErrorSe lanza cuando se excede el límite de recursión en el código.
NotImplementedErrorSe lanza cuando una función o método no está implementado, pero está presente en la interfaz.
TimeoutErrorOcurre cuando una operación supera el tiempo de espera establecido.
KeyboardInterruptSe lanza cuando el usuario interrumpe la ejecución del programa mediante la pulsación de Ctrl+C.
StopIterationSe lanza para indicar que no hay más elementos en un iterador.
StopAsyncIterationSe lanza para indicar que no hay más elementos en un iterador asíncrono.
ConnectionErrorClase base para errores relacionados con la red o las conexiones.
TimeoutErrorSe lanza cuando una operación excede el tiempo de espera.

Algunas excepciones adicionales menos comunes

  • UnicodeDecodeError – Ocurre cuando falla la decodificación de una cadena Unicode.
  • UnicodeEncodeError – Ocurre cuando falla la codificación de una cadena Unicode.
  • DeprecationWarning – Advertencia sobre el uso de características obsoletas.
  • UserWarning – Advertencia general que puede ser utilizada para notificar al usuario sobre condiciones de advertencia.

Excepción Genérica

Si no sabemos qué tipo de excepción puede ocurrir o si deseas capturar cualquier tipo de error, podemos usar un bloque except sin especificar una excepción:

1
2
3
4
try:
    x = 10 / 0
except Exception as e:
    print(f"Ocurrió un error: {e}")

Usar Exception es útil cuando no estás seguro de qué tipo de excepción puede ocurrir.

Se recomienda siempre que sea posible usar excepciones específicas para un manejo de errores más preciso.

Manejar Múltiples Excepciones

Podemos manejar diferentes tipos de excepciones con múltiples bloques except. Si tenemos varios casos de error posibles, podemos especificarlos de forma individual de la siguiente manera:

1
2
3
4
5
6
7
try:
    valor = int(input("Introduce un número: "))
    resultado = 10 / valor
except ZeroDivisionError:
    print("No puedes dividir por cero.")
except ValueError:
    print("Eso no es un número válido.")

Levantar Excepciones Personalizadas

Python nos permite crear y lanzar nuestras propias excepciones utilizando la palabra clave raise. Esto es útil cuando deseamos controlar el flujo de ejecución en situaciones específicas, como validaciones personalizadas.

Ejemplo de Excepción personalizada

1
2
3
4
5
6
7
8
9
10
11
12
class MiExcepcion(Exception):
    pass

def dividir(a, b):
    if b == 0:
        raise MiExcepcion("No se puede dividir por cero")
    return a / b

try:
    resultado = dividir(10, 0)
except MiExcepcion as e:
    print(f"Error: {e}")
Esta entrada está licenciada bajo CC BY 4.0 por el autor.