2 usuarios conectados

Manejo de excepciones en Python. Try, Except, Finally

Comparte esto

Ahora vamos a abordar un aspecto crucial de la programación robusta: el manejo de excepciones en Python, utilizando las sentencias try, except, y finally. El manejo de excepciones te permite controlar los errores que pueden ocurrir durante la ejecución de tu programa, evitando que se detenga abruptamente y proporcionando una forma de recuperarse o de realizar acciones de limpieza.

¿Qué es una Excepción?

Una excepción es un evento que ocurre durante la ejecución de un programa que interrumpe el flujo normal de las instrucciones. Pueden ser causadas por una variedad de razones, como errores de entrada/salida, errores de lógica, o problemas con los recursos del sistema.

Las Sentencias try y except:

El bloque try te permite envolver un fragmento de código donde crees que podría ocurrir una excepción. Si ocurre una excepción dentro del bloque try, la ejecución normal se detiene y Python busca un bloque except que pueda manejar esa excepción específica.

La sintaxis básica es:

Python
 
try:
    # Bloque de código que podría generar una excepción
    # ...
except TipoDeExcepcion:
    # Bloque de código que se ejecuta si ocurre TipoDeExcepcion
    # ...

Ejemplos:

  1. Manejo de ZeroDivisionError:

    Python
     
    try:
        resultado = 10 / 0
        print(resultado)  # Esta línea no se ejecutará si ocurre la excepción
    except ZeroDivisionError:
        print("¡Error! No se puede dividir por cero.")
    

    Salida:

    ¡Error! No se puede dividir por cero.
    

    En este caso, intentar dividir por cero genera una excepción ZeroDivisionError. El bloque try detecta esta excepción, y el flujo del programa salta al bloque except ZeroDivisionError, que imprime un mensaje de error. El programa no se detiene.

  2. Manejo de ValueError:

    Python
     
    try:
        numero_str = input("Ingrese un número entero: ")
        numero_int = int(numero_str)
        print(f"Usted ingresó el número: {numero_int}")
    except ValueError:
        print("¡Error! La entrada no es un número entero válido.")
    

    Si el usuario ingresa algo que no se puede convertir a un entero (por ejemplo, "abc"), la función int() generará un ValueError, y se ejecutará el bloque except ValueError.

  3. Múltiples bloques except:

    Python
     
    try:
        lista = [1, 2, 3]
        indice = int(input("Ingrese un índice: "))
        elemento = lista[indice]
        print(f"El elemento en el índice {indice} es: {elemento}")
        resultado = 10 / indice
        print(f"10 dividido por el índice es: {resultado}")
    except ValueError:
        print("¡Error! El índice debe ser un número entero.")
    except IndexError:
        print("¡Error! El índice está fuera de rango.")
    except ZeroDivisionError:
        print("¡Error! No se puede dividir por cero (índice cero).")
    

    Aquí, se manejan tres tipos diferentes de excepciones que podrían ocurrir dentro del bloque try.

La Sentencia else (opcional):

Puedes incluir un bloque else después de los bloques except. El bloque else se ejecutará solo si no se produjo ninguna excepción en el bloque try.
 

Python
 
try:
    numero_str = input("Ingrese un número entero: ")
    numero_int = int(numero_str)
except ValueError:
    print("¡Error! La entrada no es un número entero válido.")
else:
    print(f"Usted ingresó el número: {numero_int}")
    resultado = numero_int * 2
    print(f"El doble de su número es: {resultado}")

En este ejemplo, el bloque else solo se ejecuta si la conversión a entero en el bloque try fue exitosa (es decir, no se generó ValueError).

La Sentencia finally (opcional):

El bloque finally se utiliza para definir un bloque de código que siempre se ejecutará, independientemente de si ocurrió una excepción en el bloque try o no, y de si se manejó o no. Es comúnmente utilizado para realizar acciones de limpieza, como cerrar archivos o liberar recursos.
 

Python
archivo = None
try:
    archivo = open("mi_archivo.txt", "r")
    contenido = archivo.read()
    print(contenido)
except FileNotFoundError:
    print("¡Error! El archivo no fue encontrado.")
finally:
    if archivo is not None:
        archivo.close()
        print("El archivo (si estaba abierto) fue cerrado.")

En este caso, el bloque finally asegura que el archivo se cierre si fue abierto, incluso si ocurre una FileNotFoundError o cualquier otra excepción durante la lectura.

Captura de Múltiples Excepciones en un Solo Bloque except:

Puedes capturar múltiples tipos de excepciones en un solo bloque except utilizando una tupla de los tipos de excepción:
 

Python
 
try:
    # ...
except (ValueError, TypeError):
    print("¡Error! Ocurrió un problema con el tipo de valor.")

Captura de Cualquier Excepción:

Si quieres capturar cualquier tipo de excepción (generalmente no se recomienda porque puede ocultar errores inesperados), puedes usar un bloque except sin especificar el tipo de excepción:
 

Python
try:
    # ...
except:
    print("¡Ocurrió un error inesperado!")

Levantamiento de Excepciones (raise):

En ocasiones, puede que necesites levantar una excepción explícitamente en tu código. Esto se hace con la sentencia raise:
 

Python
 
def verificar_edad(edad):
    if edad < 0:
        raise ValueError("La edad no puede ser negativa.")
    elif edad < 18:
        print("Eres menor de edad.")
    else:
        print("Eres mayor de edad.")

try:
    verificar_edad(-5)
except ValueError as e:
    print(f"¡Error! {e}")

Aquí, si la edad es negativa, se levanta una excepción ValueError con un mensaje descriptivo. El bloque except la captura y la maneja.

El manejo de excepciones es fundamental para escribir código robusto y tolerante a errores. Te permite anticipar problemas potenciales y proporcionar una forma controlada de lidiar con ellos, mejorando la experiencia del usuario y la estabilidad de tus programas. ¿Te gustaría que pasemos al siguiente tema?