35- 馃捇 Try Except en Python: Gu铆a para Principiantes

Acorde贸n de los 脥ndices




馃洝️ Python Try Except

En Python, las declaraciones try y except se utilizan para manejar errores que pueden ocurrir durante la ejecuci贸n de un programa. Este proceso se conoce como manejo de excepciones.

Cuando ocurre un error en Python, se levanta una excepci贸n. Si esta excepci贸n no se maneja, el programa se detiene abruptamente. El bloque try te permite probar un bloque de c贸digo en busca de errores, y el bloque except te permite definir qu茅 hacer si ocurre un error.

Sintaxis b谩sica:

                    try:
    # Bloque de c贸digo que podr铆a generar un error
    # ...
except TipoDeError:
    # Bloque de c贸digo que se ejecuta si ocurre un error del tipo especificado
    # ...
                    
                

Ejemplo: Divisi贸n por cero

Un error com煤n es la divisi贸n por cero, que en Python levanta una excepci贸n del tipo ZeroDivisionError. Podemos manejar esta excepci贸n de la siguiente manera:

                    try:
    resultado = 10 / 0
    print(f"El resultado es: {resultado}")
except ZeroDivisionError:
    print("¡Error! No se puede dividir por cero.")
                    
                

En este ejemplo, la l铆nea resultado = 10 / 0 generar铆a un ZeroDivisionError. Sin embargo, como est谩 dentro de un bloque try y hemos definido un bloque except ZeroDivisionError, en lugar de detenerse el programa, se ejecutar谩 el c贸digo dentro del except, mostrando el mensaje de error.

El uso de try y except es fundamental para escribir programas robustos que puedan recuperarse de errores inesperados y continuar su ejecuci贸n de manera controlada.

馃洝️ Exception Handling

El manejo de excepciones es un mecanismo poderoso en Python que permite a los programas responder de manera controlada a errores en tiempo de ejecuci贸n. En lugar de que el programa falle, puedes anticipar posibles problemas y definir c贸mo quieres que el programa se comporte si ocurren.

¿Por qu茅 es importante el manejo de excepciones?

  • Robustez: Hace que tus programas sean m谩s resistentes a fallos inesperados.
  • Experiencia del usuario: Permite proporcionar mensajes de error amigables en lugar de rastreos t茅cnicos confusos.
  • Continuidad: Permite que el programa intente recuperarse del error o, al menos, finalizar de manera limpia.

Manejo de excepciones espec铆ficas:

En el ejemplo anterior, manejamos espec铆ficamente la excepci贸n ZeroDivisionError. Es una buena pr谩ctica ser lo m谩s espec铆fico posible sobre el tipo de excepci贸n que esperas manejar. Python tiene una jerarqu铆a de excepciones incorporadas, y puedes capturar tipos espec铆ficos o clases base de excepciones.

Ejemplo: Manejando `TypeError`

                    try:
    resultado = "5" + 5
    print(f"El resultado es: {resultado}")
except TypeError:
    print("¡Error! Operaci贸n no v谩lida entre tipos.")
                    
                

Aqu铆, intentamos sumar una cadena y un entero, lo que genera un TypeError. El bloque except TypeError captura este error y muestra un mensaje apropiado.

Capturando m煤ltiples tipos de excepciones:

Puedes manejar m煤ltiples tipos de excepciones en bloques except separados:

                    try:
    valor = int(input("Introduce un n煤mero: "))
    resultado = 10 / valor
    print(f"El resultado es: {resultado}")
except ValueError:
    print("¡Error! Debes introducir un n煤mero entero.")
except ZeroDivisionError:
    print("¡Error! No se puede dividir por cero.")
                    
                

En este caso, si el usuario introduce algo que no es un entero, se levantar谩 un ValueError. Si introduce cero, se levantar谩 un ZeroDivisionError, y cada excepci贸n se maneja con su propio mensaje.

El manejo adecuado de las excepciones es una habilidad clave en la programaci贸n en Python que conduce a la creaci贸n de software m谩s confiable y f谩cil de usar.

➕ Many Exceptions

En el tema anterior, vimos c贸mo manejar diferentes tipos de excepciones utilizando m煤ltiples bloques except. Python tambi茅n te permite manejar m煤ltiples excepciones en un solo bloque except utilizando una tupla de los tipos de excepci贸n.

Sintaxis para manejar m煤ltiples excepciones en un bloque:

                    try:
    # Bloque de c贸digo que podr铆a generar varios tipos de errores
    # ...
except (TipoDeError1, TipoDeError2, ...):
    # Bloque de c贸digo que se ejecuta si ocurre cualquiera de los errores especificados
    # ...
                    
                

Esto es 煤til cuando quieres ejecutar el mismo bloque de c贸digo de manejo para diferentes tipos de errores.

Ejemplo: Manejando `TypeError` y `ValueError` juntos

                    try:
    valor = input("Introduce un n煤mero: ")
    resultado = 10 + int(valor)  # Podr铆a generar TypeError o ValueError
    print(f"El resultado es: {resultado}")
except (TypeError, ValueError):
    print("¡Error! Entrada inv谩lida. Debes introducir un n煤mero.")
                    
                

En este ejemplo, si el usuario introduce una cadena que no se puede convertir a un entero, se generar谩 un ValueError. Si por alguna raz贸n la operaci贸n de suma con `10` falla debido al tipo de `valor` (aunque `int(valor)` deber铆a prevenirlo si la conversi贸n falla), se podr铆a generar un TypeError. Ambos errores se manejan con el mismo mensaje.

Capturando la excepci贸n como un objeto:

Tambi茅n puedes capturar la instancia de la excepci贸n para acceder a informaci贸n detallada sobre el error utilizando la sintaxis except TipoDeError as nombre_del_objeto:

                    try:
    resultado = 10 / 0
except ZeroDivisionError as e:
    print(f"¡Ocurri贸 un error de divisi贸n por cero: {e}")
                    
                

Aqu铆, la excepci贸n ZeroDivisionError se captura como el objeto `e`, y podemos imprimir una descripci贸n del error proporcionada por la excepci贸n.

Manejar m煤ltiples excepciones de manera eficiente hace que tu c贸digo sea m谩s limpio y f谩cil de mantener, especialmente cuando la respuesta a diferentes tipos de errores es la misma.

➡️ Else

Python te permite a帽adir un bloque else opcional despu茅s de todos los bloques except. El bloque else se ejecuta solo si el bloque try no levanta ninguna excepci贸n.

Sintaxis del bloque `else`:

                    try:
    # Bloque de c贸digo que podr铆a generar un error
    # ...
except TipoDeError:
    # Bloque de c贸digo que se ejecuta si ocurre un error del tipo especificado
    # ...
else:
    # Bloque de c贸digo que se ejecuta si NO ocurre ning煤n error en el bloque try
    # ...
                    
                

El bloque else es un buen lugar para colocar c贸digo que depende de que el bloque try se haya ejecutado con 茅xito. Esto ayuda a separar el manejo de errores del flujo principal del c贸digo cuando no hay errores.

Ejemplo: Usando `else` con divisi贸n

                    try:
    numerador = int(input("Introduce el numerador: "))
    denominador = int(input("Introduce el denominador: "))
    resultado = numerador / denominador
except ValueError:
    print("¡Error! Debes introducir n煤meros enteros.")
except ZeroDivisionError:
    print("¡Error! No se puede dividir por cero.")
else:
    print(f"El resultado de la divisi贸n es: {resultado}")
                    
                

En este ejemplo, si el usuario introduce dos enteros v谩lidos y no se produce una divisi贸n por cero, el bloque else se ejecutar谩 e imprimir谩 el resultado de la divisi贸n. Si ocurre alguna de las excepciones (`ValueError` o `ZeroDivisionError`), el bloque else se omitir谩.

El bloque else proporciona una forma clara de especificar el c贸digo que debe ejecutarse en el caso de que la parte "try" de la declaraci贸n tenga 茅xito, lo que mejora la legibilidad y la estructura del c贸digo de manejo de excepciones.

⏱️ Finally

Python te permite incluir un bloque finally opcional despu茅s de los bloques except (y el bloque else, si est谩 presente). El bloque finally siempre se ejecuta, independientemente de si ocurri贸 o no una excepci贸n en el bloque try y de si se manej贸 o no.

Sintaxis del bloque `finally`:

                    try:
    # Bloque de c贸digo que podr铆a generar un error
    # ...
except TipoDeError:
    # Bloque de c贸digo que se ejecuta si ocurre un error del tipo especificado
    # ...
else:
    # Bloque de c贸digo que se ejecuta si NO ocurre ning煤n error en el bloque try
    # ...
finally:
    # Bloque de c贸digo que SIEMPRE se ejecuta al final
    # ...
                    
                

El bloque finally se utiliza t铆picamente para realizar acciones de limpieza que deben ocurrir sin importar lo que pase en el bloque try, como cerrar archivos o liberar recursos.

Ejemplo: Usando `finally` para cerrar un archivo

                    archivo = None
try:
    archivo = open("mi_archivo.txt", "r")
    contenido = archivo.read()
    # Procesar el contenido del archivo
    print(contenido)
except FileNotFoundError:
    print("¡Error! El archivo no fue encontrado.")
except Exception as e:
    print(f"Ocurri贸 otro error: {e}")
finally:
    if archivo is not None:
        archivo.close()
        print("El archivo se ha cerrado.")
                    
                

En este ejemplo, el bloque finally asegura que el archivo se cierre correctamente, ya sea que se haya abierto y le铆do sin problemas, o si ocurri贸 una excepci贸n como FileNotFoundError o cualquier otra. Esto es crucial para evitar la p茅rdida de recursos.

El bloque finally es una herramienta esencial para garantizar la correcta gesti贸n de los recursos en tus programas Python, proporcionando un lugar seguro para ejecutar c贸digo de limpieza.

⚠️ Raise an exception

Adem谩s de que Python levante excepciones autom谩ticamente cuando ocurren errores, tambi茅n puedes generar excepciones expl铆citamente en tu c贸digo utilizando la declaraci贸n raise.

Esto es 煤til en situaciones donde quieres indicar que algo inesperado ha ocurrido o que se ha violado una condici贸n espec铆fica definida por tu l贸gica.

Sintaxis de `raise`:

                    raise TipoDeError("Mensaje de error opcional")
                    
                

Puedes levantar cualquier tipo de excepci贸n incorporada en Python o incluso definir tus propias excepciones personalizadas (lo cual veremos en lecciones futuras).

Ejemplo: Levantando una excepci贸n si un valor no es v谩lido

                    def calcular_edad(a帽o_nacimiento):
    if a帽o_nacimiento > 2025:
        raise ValueError("El a帽o de nacimiento no puede ser posterior al a帽o actual.")
    edad = 2025 - a帽o_nacimiento
    return edad

try:
    a帽o = int(input("Introduce tu a帽o de nacimiento: "))
    edad = calcular_edad(a帽o)
    print(f"Tu edad es: {edad}")
except ValueError as e:
    print(f"¡Error! {e}")
                    
                

En este ejemplo, la funci贸n calcular_edad verifica si el a帽o de nacimiento es posterior al a帽o actual. Si lo es, levanta una excepci贸n ValueError con un mensaje descriptivo. El bloque try...except captura esta excepci贸n y muestra el mensaje de error al usuario.

Re-levantando una excepci贸n:

Dentro de un bloque except, a veces puedes decidir que no puedes manejar completamente una excepci贸n y necesitas pasarla a un nivel superior para que sea manejada all铆. Puedes hacer esto usando raise sin especificar un tipo de excepci贸n:

                    try:
    resultado = 10 / 0
except ZeroDivisionError:
    print("Se intent贸 dividir por cero.")
    # Realizar alguna acci贸n de limpieza local
    # ...
    raise  # Re-levanta la excepci贸n ZeroDivisionError
                    
                

En este caso, se imprime un mensaje local, se realiza alguna limpieza y luego la excepci贸n original ZeroDivisionError se vuelve a levantar para que pueda ser manejada por un bloque try...except m谩s externo.

La capacidad de levantar excepciones manualmente te da un control significativo sobre el flujo de errores en tu programa, permiti茅ndote se帽alar condiciones inesperadas de manera clara y estructurada.




Publicar un comentario

0 Comentarios