1. Introducción

En Python, los errores y las excepciones ocurren cuando el intérprete se encuentra con algo inesperado, como una operación matemática imposible o una referencia a una variable no definida. Es fundamental aprender cómo gestionarlos para crear programas robustos y capaces de manejar situaciones imprevistas sin interrumpir su ejecución.

En este tutorial, aprenderemos a:

  1. Diferenciar entre errores y excepciones.
  2. Utilizar bloques try, except, else y finally.
  3. Crear excepciones personalizadas.
  4. Prácticas recomendadas para la gestión de errores.
  5. Resolver ejercicios prácticos para consolidar conocimientos.

2. ¿Qué es un Error en Python?

Tipos de errores comunes (ver lista completa Python Built-in Exceptions):

SyntaxError: Se produce cuando hay un error en la sintaxis del código.

# Ejemplo de SyntaxError
>>> print("Hola mundo) 
  File "<stdin>", line 1
    print("Hola mundo) 
          ^
SyntaxError: unterminated string literal (detected at line 1)
>>> 

NameError: Ocurre cuando intentas acceder a una variable que no ha sido definida.

>>> print(variable_no_definida)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'variable_no_definida' is not defined

TypeError: Se genera al intentar operar con tipos incompatibles.

>>> resultado = "3" + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

ValueError: Aparece cuando se usa un valor inapropiado para una operación.

>>> numero = int("texto")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'texto'

2.1. Ahora prueba tu

Encuentra y corrige los errores en el siguiente código:

num1 = "5"
num2 = 10
resultado = num1 * num2
print("El resultado es: " + resultado)

3. ¿Qué es una Excepción?

Una excepción es un error que ocurre en tiempo de ejecución, lo que detiene la ejecución normal del programa. Python proporciona mecanismos para “atrapar” estas excepciones y gestionar el flujo de control cuando ocurren.

3.1. Bloques try y except

El bloque try se utiliza para encerrar el código que podría generar una excepción. Si se genera una excepción en este bloque, el flujo pasa al bloque except.

try:
    numero = int(input("Introduce un número: "))
    resultado = 10 / numero
    print(f"El resultado es: {resultado}")
except ZeroDivisionError:
    print("¡No se puede dividir por cero!")
except ValueError:
    print("Por favor, introduce un valor numérico.")

En este ejemplo, se gestionan dos excepciones:

  1. ZeroDivisionError: si el usuario introduce un 0 como divisor.
  2. ValueError: si el usuario introduce un valor no numérico.

3.2. Bloques else y finally

  • else : Se ejecuta si no se produce ninguna excepción.
  • finally: Se ejecuta independientemente de si se produce una excepción o no, útil para liberar recursos como archivos abiertos o conexiones a bases de datos.

    try:
    numero = int(input("Introduce un número: "))
    resultado = 10 / numero
    except ZeroDivisionError:
    print("¡No se puede dividir por cero!")
    else:
    print(f"El resultado es: {resultado}")
    finally:
    print("Ejecución finalizada, gracias por usar el programa.")
    

3.3. Ahora prueba tu

Modifica el siguiente código para que gestione las posibles excepciones ZeroDivisionError y ValueError, y utilice finally para imprimir un mensaje final.

numero = int(input("Introduce un número: "))
resultado = 100 / numero
print(f"El resultado es: {resultado}")

4. Creación de Excepciones Personalizadas

Podemos definir nuestras propias excepciones heredando de la clase base Exception. Esto es útil cuando queremos definir condiciones de error específicas en nuestro programa.

class ErrorPersonalizado(Exception):
    def __init__(self, mensaje):
        self.mensaje = mensaje

try:
    edad = int(input("Introduce tu edad: "))
    if edad < 0:
        raise ErrorPersonalizado("La edad no puede ser un número negativo.")
    print(f"Tienes {edad} años.")
except ErrorPersonalizado as e:
    print(e.mensaje)

En este ejemplo, se levanta una excepción personalizada si el valor de edad es negativo

4.1. Ahora prueba tu

Define una excepción personalizada llamada SaldoInsuficiente que se active si el saldo en una cuenta bancaria es menor al monto a retirar. Luego, gestiona la excepción en un pequeño programa.

5. Prácticas Recomendadas para la Gestión de Excepciones

  1. No uses excepciones para el flujo de control normal: Las excepciones deben gestionarse solo para errores y no como una estructura de control estándar.
  2. Captura excepciones específicas en lugar de usar except genérico: Esto facilita la depuración.

    try:
    # Código
    except (ZeroDivisionError, ValueError):
    # Manejo específico de excepciones
    
  3. Usa finally para liberar recursos: Por ejemplo, cerrar un archivo o una conexión a base de datos.

  4. Levanta excepciones personalizadas cuando tenga sentido: Útil para condiciones específicas de la aplicación.

6. Ejercicio

Enunciado:

Implementa un programa que simule un cajero automático. El programa debe:

  1. Solicitar al usuario que ingrese el monto a retirar.
  2. Comprobar que el monto sea numérico y positivo.
  3. Gestionar un error de SaldoInsuficiente si el monto a retirar excede el saldo disponible.
  4. Mostrar mensajes adecuados en cada caso y, al finalizar, informar que la transacción ha terminado.

7. Referencias