Cómo manejar excepciones en Python (intenta-excepto-finalmente)

Aprenda a manejar excepciones en Python usando los bloques try, except, else y finalmente. Escriba código Python libre de errores y resistente a fallos.

Pruebe esta solución en el Editor

Descripción general

El software robusto debe estar preparado para manejar condiciones inesperadas, como archivos faltantes, entradas de usuario no válidas, fallas en la base de datos o interrupciones en la red. Cuando ocurre un error en Python, genera una excepción. Si no se controlan, las excepciones detienen su programa inmediatamente e imprimen una pila de rastreo.

La herramienta principal de Python para gestionar errores de tiempo de ejecución es el bloque "try-except". Usted coloca código que podría generar un error dentro del bloque `try` y define el código de manejo de errores dentro de uno o más bloques `except`. Se recomienda encarecidamente especificar la clase de excepción exacta (como `ValueError` o `ZeroDivisionError`), ya que detectar todas las excepciones genéricas (`except:`) puede enmascarar errores.

Para que su excepción fluya más expresiva, Python proporciona dos bloques adicionales: "else" y "finally". El bloque `else` se ejecuta solo si no se generaron excepciones en el bloque `try`, lo cual es útil para código que solo debería ejecutarse en caso de éxito. El bloque `finalmente` se ejecuta *siempre*, independientemente de si ocurrió una excepción, lo que lo convierte en el lugar perfecto para limpiezas como cerrar archivos o conexiones de bases de datos.

Código y salida de ejecución

Este script demuestra un manejo sólido de errores en Python usando try, excepto, else y finalmente.

handle_errors.py
Pruébelo en el editor
def divide_numbers(a, b):
    try:
        # Code that might raise an exception
        result = a / b
    except ZeroDivisionError:
        # Handling a specific exception
        print("Error: Cannot divide by zero!")
    except TypeError:
        # Handling another exception type
        print("Error: Inputs must be numbers!")
    else:
        # Run only if try block succeeded
        print(f"Success! Result of {a}/{b} is {result}")
    finally:
        # Runs no matter what
        print("Division attempt completed.")

divide_numbers(10, 2)
print("---")
divide_numbers(10, 0)
Salida terminal
Success! Result of 10/2 is 5.0
Division attempt completed.
---
Error: Cannot divide by zero!
Division attempt completed.

Implementación paso a paso

  • Coloque el código que podría fallar dentro de un bloque de prueba.
  • Detecte tipos de errores específicos con bloques excepto ExceptionType: para manejar las fallas con elegancia.
  • Utilice else para el código que debe ejecutarse solo en bloques de prueba exitosos.
  • Úselo finalmente para garantizar que las acciones de limpieza se ejecuten independientemente de los errores.

Preguntas frecuentes

¿Puedo detectar múltiples excepciones en un solo bloque excepto?

Sí, puedes pasarlos como una tupla: excepto (ValueError, TypeError) como e:.

¿Cómo planteo mis propias excepciones?

Utilice la palabra clave rise seguida de la instancia de excepción: rise ValueError("Valor de configuración no válido").

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.