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:
defprint_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 Exception
print_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.
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
#Calculadora usando Excepciones y Errores defadd(a,b):return a+b
defsubtract(a,b):return a-b
defmultiply(a,b):return a*b
defdivide(a,b):return a/b
defcalculator(): ops ={"1":add,"2":subtract,"3":multiply,"4":divide}whileTrue:print("Select the operation: ")print("1.-Addition")print("2.-Subtraction")print("3.-multiplication")print("4.-division")print("5.-exit")try: option =input("enter the option: ")if option =="5":print("you closed the calculator")breakelif option in ops: current_op = ops[option]whileTrue: num1 =float(input("enter the firts number: ")) num2 =float(input("enter the second number: "))if option =="4"and num2 ==0:print("Error: divisor cannoy by Zero")continue result = current_op(num1, num2)print("the result is: ", result)whileTrue: otra =input("another calculation with same operation? (y/n): ").strip().lower()if otra =="y":breakelif otra =="n":returnelse:print("invalid option, please try again")else:print("invalid option, please try again ")continueexcept ValueError:print("Error: please enter a valid number")calculator()
Les paso mi ejercicio aplicando def edad(tu_edad): if tu_edad < 0: print("Error: Me diste un numero negativo. Por favor, ingresa tu fecha correcta.") solicitud_edad() else: print("Tu edad es:", tu_edad)
def solicitud_edad(): try: tu_edad = int(input("Dime tu edad: ")) edad(tu_edad) return tu_edad except ValueError: print("Error: No ingresaste un número. Por favor, intenta de nuevo.") solicitud_edad()
solicitud_edad()recursividad y funciones para pedir la Edad:
Algo simple pero efectivo.
defedad(tu_edad):if tu_edad <0:print("Error: Me diste un numero negativo. Por favor, ingresa tu fecha correcta.") solicitud_edad()else:print("Tu edad es:", tu_edad)defsolicitud_edad():try: tu_edad =int(input("Dime tu edad: ")) edad(tu_edad)return tu_edad
except ValueError:print("Error: No ingresaste un número. Por favor, intenta de nuevo.") solicitud_edad()solicitud_edad()
complementando...
def numeroImpar(n):if not isinstance(n, int): raise TypeError("Error: Las letras no son válidas")if n <=0: raise ValueError("Error: La edad no puede ser menor o igual a 0")if n %2!=0:print("El número es impar")else:print("El número es par")try:numeroImpar(-3) # Aquí estás probando con una cadena
except(TypeError,ValueError)ase:print(e)
Creo que faltó la explicación del raise. Menos mal algunos compañeros lo aclararon.
Espero que venga en una de las siguientes clases.
Si un método no puede manejar un error de forma efectiva, puede lanzar el error para que un método superior lo maneje. Este es el principio básico del manejo de excepciones en Python: dejar que los métodos superiores gestionen los errores cuando no pueden ser manejados en el nivel actual.
Resumen
raise te permite lanzar excepciones en un método y propagarlas hacia métodos superiores que las manejen.
Si el método superior no captura la excepción, se propaga aún más hacia arriba (hacia la capa principal de ejecución).
Puedes usar raise para hacer que un método "pase" los errores a otro método que pueda tener más contexto o más capacidades para manejar los errores.