Acorde贸n de los 脥ndices
脥ndice de los temas
馃洝️ 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.
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias