Las excepciones en Python están organizadas en una jerarquía de clases, donde las excepciones más generales se encuentran en la parte superior y las más específicas en la parte inferior.
Esta organización jerárquica permite a los programadores manejar excepciones de manera más precisa y efectiva.
numeros =[1,2,3,4,5,6,7,8,9,10]transformados =[x *2if x %2==0else x for x in numeros]print("Números transformados:", transformados)
Por ejemplo, la excepción Exception es la clase base para la mayoría de las excepciones, y de ella derivan subclases como ArithmeticError y ValueError.
Comprender esta jerarquía es crucial para poder manejar las excepciones adecuadamente y elegir las excepciones específicas que se desean capturar.
A continuación se muestra un código que imprime la jerarquía de excepciones en Python:
def print_exception_hierarchy(exception_class, indent=0):print(' '* indent + exception_class.__name__)for subclass in exception_class.__subclasses__():print_exception_hierarchy(subclass, indent +4)# Imprimir la jerarquía comenzando desde la clase base Exceptionprint_exception_hierarchy(Exception)
Este código utiliza recursión para recorrer y mostrar las subclases de excepciones, permitiéndote visualizar cómo están organizadas y relacionadas entre sí.
Entender la jerarquía de excepciones en Python es fundamental para escribir código robusto y manejable. Al conocer las relaciones entre las diferentes excepciones, puedes capturar errores de manera más específica, lo que te permite implementar manejadores de excepciones más precisos y efectivos.
En ciertas ocasiones necesitarás errores personalizados para tu programa. Para levantar una excepción o error puedes utilizar raise y seguido de la clase del error con un mensaje personalizado.
Por ejemplo, creemos una función que evalúe la edad de un usuario no sea negativa y que no sea menor de edad.
defverificar_edad(edad):if edad <0:raise ValueError("La edad no puede ser negativa")elif edad <18:raise Exception("La persona es menor de edad")else:return"Edad válida"
Levantar excepciones hace que nuestro código más explicativo de lo que debemos o no manejar.
¡Nunca pares de aprender! 🚀🚀
No lo sabía, super valioso tu aporte!
¡Gran dato! Gracias.
Manejo de Excepciones y Uso de Pass
El manejo de excepciones en Python se hace usando try y except, para que el programa no se detenga cuando ocurre un error.
Cuando algo dentro de try genera un error, el flujo salta a except, donde puedes manejar el error.
Errores comunes:
SyntaxError: Ocurre cuando hay un error en la escritura del código, como olvidar un paréntesis. No puedes manejarlo con try-except porque impide que el programa se ejecute.
TypeError: Sucede cuando tratas de hacer una operación con tipos de datos incompatibles, como sumar un número y una cadena.
ZeroDivisionError: Ocurre al intentar dividir entre cero.
ValueError: Sucede cuando el tipo de dato es correcto, pero el valor no es válido, como convertir una cadena no numérica en entero:
El uso de pass es simplemente para ignorar el error sin hacer nada.
Gracias Lizzet por tu buena investigación.
Good summary!
Oigan estoy loco o esta clase no estaba antes, porque me la pase 🤣, solo ví la pasada que termina con código que te da las jerarquías
Aquí como puedo hacerle para que ya se rompa el while
whileTrue:try: divisor =int(input("Ingresa un numero divisor: ")) result =100/divisor
print(result)except ZeroDivisionError as e:print("ERROR: No se puede dividir entre 0")print("Ha ocurrido un error del tipo:", e)except ValueError as e:print("ERROR: Debes introducir cualquier numero que no sea cero")print("Ha ocurrido un error del tipo:", e)```whileTrue:try: divisor =*int*(input("Ingresa un numero divisor: ")) result =100/divisor print(result)except*ZeroDivisionError*as e:print("ERROR: No se puede dividir entre 0")print("Ha ocurrido un error del tipo:", e)except*ValueError*as e:print("ERROR: Debes introducir cualquier numero que no sea cero")print("Ha ocurrido un error del tipo:", e)
Me paso igual, casualmente me puse a ver el contenido de las clase y me di cuenta que por alguna razón esta clase me la había saltado.
En cuanto a tu código creo que simplemente debes poner un break al final del código dentro del try: de la siguiente forma:
try: divisor =int(input("Ingresa un numero divisor: ")) result =100/divisor
print(result)break # con este break salimos del bucle
except ZeroDivisionErrorase:print("ERROR: No se puede dividir entre 0")print("Ha ocurrido un error del tipo:", e) except ValueErrorase:print("ERROR: Debes introducir cualquier numero que no sea cero")print("Ha ocurrido un error del tipo:", e)```  
aaa el break jajaja, tantas cosas que siempre seme olvidan jaja, gracias Humberto
Para capturar múltiples errores en Python, puedes usar múltiples bloques except después de un bloque try. Por ejemplo:
try:# Código que puede causar excepciones result =100/ divisor
except ZeroDivisionError:print("El divisor no puede ser cero.")except ValueError:print("Debes introducir un número válido.")
También puedes capturar múltiples excepciones en un solo except usando una tupla:
try:# Código que puede causar excepciones result =100/ divisor
except(ZeroDivisionError, ValueError)as e:print(f"Ocurrió un error: {e}")
Esto permite manejar diferentes tipos de errores de manera efectiva, mejorando la robustez de tu código.
Primero, se ejecuta la cláusula try (la(s) linea(s) entre las palabras reservadas try y la except).
Si no ocurre ninguna excepción, la cláusula except se omite y la ejecución de la cláusula try finaliza.
Si ocurre una excepción durante la ejecución de la cláusula try, se omite el resto de la cláusula. Luego, si su tipo coincide con la excepción nombrada después de la palabra clave except, se ejecuta la cláusula except, y luego la ejecución continúa después del bloque try/except.
Si ocurre una excepción que no coincide con la excepción nombrada en la cláusula except, esta se pasa a las sentencias try externas; si no se encuentra un manejador, se trata de una excepción no manejada y la ejecución se detiene con un mensaje de error.
El último punto quiere decir que cuando ocurre una excepción dentro de un bloque try, el programa busca un bloque except que pueda manejar ese tipo de excepción. Si la excepción que ocurre no coincide con la especificada en el except, la excepción se propaga hacia los bloques try externos (si los hay).
Si, después de recorrer todos los bloques try, no se encuentra un manejador adecuado para la excepción, el programa finaliza con un mensaje de error, lo que se conoce como una excepción no manejada.
Acabo de inhabilitar el copiloto de la IA porque no me esta dejando ni empezar a pensar en las soluciones.... Pongo la linea de comentarios y ya esta el código perfectamente listo.
Las generaciones que vienen tienen un riesgo loco de tener el cerebro atrofiado.
En nada, solo se va a desgastar la tecla del TAB.
hahaha yo escribi mi codigo en un cuaderno o en word para asegurarme de pensar y despues intentarlo, es verdad que la IA te va a la larga evitar que aprendas.
Solución con bucle:
while True:
try:
divisor = int(input("Ingresa un número divisor: "))
result = 100/divisor
print(result)
break
except ZeroDivisionError:
print("Error: El divisor no puede ser cero.")
except ValueError:
print("Error: Debes introducir un número válido.")
esto parece magia, esta clase no la vi y ahora que reviso el curso esta
Hola! estamos aumentando clases para mejorar el aprendizaje :D
You are right, it's a magic new course
👩🏼💻Mis apuntes de la clase:
El manejo de excepciones y errores es un tema fundamental en cualquier lenguaje de programación para crear programas robustos y confiables. Nos permiten anticiparnos a problemas que puedan surgir durante la ejecución del código.
¿Qué son los Errores y las Excepciones?
Errores: Problemas que impiden la ejecución del programa. Por lo general son fallos de sintaxis (SintaxError), o bien problemas con el entorno que no se pueden manejar en tiempo de ejecución.
Excepciones: Eventos que ocurren durante la ejecución de un programa que interrumpen el flujo normal del código. Estas se detectan en tiempo de ejecución lo que permite que puedan manejarse y controlarse.
¿Cómo manejamos las Excepciones? Mediante el mecanismo try-except.
try:# Código principal, contiene la lógica.# Aquí puede producirce una excepción.passexcept Exception:# Bloque con el código que se ejecutara en caso de que try produzca una excepcion.pass
try: Contiene el código que podría generar una excepción. Si no ocurre ninguna excepción dentro de este bloque, el bloque except se omite.
except: Contiene el código que se ejecutará si el bloque try produce una excepción.
Exception: Captura la excepción Exception encapsula TODOS los tipos de excepciones.
⚠️ Exception Captura cualquier error, pero utilizarlo para todas las excepciones podría ocultarnos información importante sobre el error que se produjo.
Las excepciones tienen jerarquía de clases, la principal es justamente Exception.
Ejemplo de capturar un error especifico: división entre 0.
try: divisor =int(input("Ingresa el divisor: ")) result =100/ divisor
print(f"100 / {divisor} = {result}")except ZeroDivisionError:print("Error: El divisor no puede ser 0.")
En el ejemplo, si se intenta dividir el 100 entre 0 obtendremos el mensaje de "Error: El divisor no puede ser 0.".
También es posible utilizar más de una excepción, lo cuál nos permite tener aun más control sobre lo que ocurre en nuestro programa.
try: divisor =int(input("Ingresa el divisor: ")) result =100/ divisor
print(f"100 / {divisor} = {result}")except ValueError:print("Error: Por favor introduce un valor numérico para el divisor.")except ZeroDivisionError:print("Error: El divisor no puede ser 0.")
En caso que el usuario capture un valor alfanumérico, el programa lanzara el mensaje "Error: Por favor introduce un valor numérico para el divisor.", o si el valor capturado es 0 obtendremos el otro mensaje.
Capturar la excepción en una variable para dar más información de lo que ocurrió al usuario. Una opción adicional es capturar excepciones genéricas con Exception, pero después de manejar las excepciones más obvias en las que caerá nuestro programa.
try: divisor =int(input("Ingresa el divisor: ")) result =100/ divisor
print(f"100 / {divisor} = {result}")except ValueError:print("Error: Por favor introduce un valor numérico para el divisor.")except ZeroDivisionError:print("Error: El divisor no puede ser 0.")except Exception as e:print(f"Ocurrió un error inesperado: {e}")
Junto al mecanismo try-except podremos utilizar else y finally, éstas dos instrucciones son opcionales, pero pueden nos ayudan a mejorar el flujo de nuestro programa en caso de tener problemas.
else: Bloque que se ejecuta solo si no hubo excepciones en el try.
try: divisor =int(input("Ingresa el divisor: ")) result =100/ divisor
except ValueError:print("Error: Por favor introduce un valor numérico para el divisor.")except ZeroDivisionError:print("Error: El divisor no puede ser 0.")except Exception as e:print(f"Ocurrió un error inesperado: {e}")else:print(f"100 / {divisor} = {result}")print("División completada exitosamente.")
finally: Bloque se ejecuta siempre, sin importar si ocurrio una excepción o no, incluso si el bloque try contenia una sentencia return o break. Este bloque es ideal para operaciones de limpieza, como cerrar una conexión a bases de datos, cerrar archivos, etc.
archivo =None# Inicializamos a None por seguridadtry: archivo =open("mi_archivo.txt","r")# Intenta abrir un archivo (podría dar FileNotFoundError) contenido = archivo.read()print(f"Contenido del archivo: {contenido}")except FileNotFoundError:print("Error: El archivo no fue encontrado.")except Exception as e:print(f"Ocurrió un error inesperado: {e}")finally:# Este código se ejecuta SIEMPREif archivo:# Verifica si el archivo fue abierto antes de intentar cerrarlo archivo.close()print("El archivo ha sido cerrado (desde finally).")
Lo que distingue a un programador regular de uno excelente, es la capacidad de manejar errores de manera efectiva.
Implementé el ciclo para preguntar de manera recurrente al usuario mientras siga cometiendo un error. La implementación consistió en un ciclo while True que dejaba de recorrerse justamente cuando no había ninguna excepción, es decir, el break va en el try:
whileTrue:try: divisor =int(input("Ingrese un número n para ejecutar la divisón 100/n: ")) divison =100/divisor
print(divison)breakexcept ZeroDivisionError as e:print("Error: No es posible dividir entre 0")print("Tipo de error: ", e)except ValueError as e:print("Error: Ingresó un valor incorrecto, ingrese un número válido.")print("Tipo de error: ", e)
Entender cómo Python maneja los errores nos permite anticipar y solucionar problemas de manera más eficiente, en lugar de solo esperar que el intérprete nos señale el error exacto.
no veo el uso del raise :(
no es recomendable usar try en todo lo que desarrollamos ya que esto puede afectar la perfomance de nuestro desarrollo , por eso hay que estar seguro en que parte es necesario manejar excepciones que puedan ocasioanar errores.
try:
divisor = int(input("Ingresa un número divisor:")) # Valor ingresado por el usuario
resultado = 100 / divisor
print(resultado)
except ZeroDivisionError as e:
print("Error: El divisor no puede ser cero.")
print("Tipo de error: ",e)
except ValueError as e:
print("Error: El divisor debe ser un número entero (n>0).")
print("Tipo de error: ",e)
# Salidas
# (2) = 50
# (0) = Error: El divisor no puede ser cero., Tipo de error: division by zero
# (a) = Error: El divisor debe ser un número entero (n>0)., Tipo de error: invalid literal for int() with base 10: 'a'
# (*) = Error: El divisor debe ser un número entero (n>0)., Tipo de error: invalid literal for int() with base 10: '*'
que buena es esta clase muy bien explicada. muchas gracias Carla
Aquí agregué el loop para que después de un error, se le vuelva a pedir al user un input
whileTrue:try: numero =int(input(" Indica un numero: ")) operacion =100/numero
print(operacion)except ZeroDivisionError as a:print("Error!!!! No se puede dividir entre cero")print("El error arrojado es: ", a)except ValueError as a:print("Error!!!! Estás intentado agregar un valor que no es número")print("El error arrojado es: ", a)
Hola, soy muy nueva en el tema. Y tengo varias preguntas, me gustaría saber si hay un libro o manual para conocer todo tipo variables que se usan en Python y también cómo sé en qué momento utilizarlas?
Cómo se ve reflejado el trabajo de código en la realidad?
No sé de libros, pero podrías preguntarle a ChatGPT o tu LLM de confianza.
Para los que le aparece en español el código para saber el tipo de error