Maneja las excepciones
Clase 31 de 56 • 21 Días de Python
Contenido del curso
Clase 31 de 56 • 21 Días de Python
Contenido del curso
Nicolas Alpargatero
Eduardo Peña Ramos
CARLOS ALBERTO MARTINEZ SANCHEZ
Luis Kennedy Saavedra Fuentes
Eduardo Peña Ramos
Enrique Barrera
Oscar Dario Florez Diaz
Emmanuel Paiva
Fernando Lavao Orjuela
Francisco Pin
Ángel Sabillón
Erick Infante
Edwin Absalón Martinez Moreno
Fabricio González Guasque
Alejandro Anaya
Waldir Zapata Garcia
Waldir Zapata Garcia
José Miguel Reyes
Harold Zurita Simon
iecgerman .
andres barrera
Linda Atenea Mejía Usme
Manuel Juarez
Investigando el raise va a dejar el traceback es decir mostrara la parte del código que genera el error, para Desarrolladores, pues bien, pero para usuario final nada, feo, por tanto, para evitar esto se puede generalizar las Excepciones con:
except Exception as e: return f"Error: {str(e)}"
Si lo colocan en este reto no funciona, porque el playground exige que visualice con raise., pero en la buena práctica sera util
Cierto, es muy útil. El usuario final no debería ver el traceback.
¿Qué es un 'Traceback'?
No entiendo o no estoy muy claro aquí con la solución del programa.
La idea no es que el programa no se interrumpa? Que muestre el error pero sin interrupirse la ejecución.
Yo hice el programa guardando el error en una variable y luego retornarla. Pero no pasaba el test, luego de los 3 intentos, veo la solución del ejercicio aquí. Y al ejecutar esa solución fuera de aquí. Muestra el error pero primero se detiene el programa.
Sí, idealmente el programa no debería interrumpirse (porque no hay errores). Este módulo trata de cómo debe reaccionar el programa ante errores o ante valores inválidos. Lo bonito es que el programador tiene libertad para decidir qué sucederá al encontrar un error o dato no válido.
>
>
>
>
>
>
def calculate_discounted_price(price, discount): if not isinstance(price, (int, float)) or not isinstance(discount, (int, float)): raise TypeError("El precio y el descuento deben ser números") else: if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") else: try: return(price * (1-discount)) except Exception as e: return e("Ha ocurrido un error inesperado")
def calculate_discounted_price(price, discount): if not isinstance(price,(int,float)) or not isinstance(discount,(int,float)): raise TypeError("El precio y el descuento deben ser números") if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") try: return price - (price * discount) except Exception as e: raise Exception(f"Ha ocurrido un error inesperado")
Mi solución:
def calculate_discounted_price(price, discount): # Tu código aquí 👈 if not isinstance(price, (int, float, complex)) or not isinstance(discount, (int,float, complex)): raise TypeError("El precio y el descuento deben ser números") if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") try: return price - price * discount except Exception as e: return "Ha ocurrido un error inesperado" + str(e)
Fortalecer tu compresión y entendimiento con la lógica de Python, ayudara
mi aporte y desarrollo a este ejercicio lo complemente con IA
Para este ejercicio es util identificar y dividir en partes lo que nos solicitan para poder desarrollar la funcion
Para el desarrollo de este ejercicio utilice estas varibles, funciones, llamada a funcion, condicionales y sentencia de exepcion
**es una llamada a funcion, que toma dos argumentos, price el objeto que quiere comprobar, (int, float), una tupla de tipos y esta llamada a funcion nos devolvera true si price es instancia de alguno de estos (int, float)
** Es una sentencia de excepción, que nos permite lanzar un objeto de tipo ValueError, esto permite interrumpir la ejecucion normal y sube esa excepcion hasta que la capturen en try/except
def calculate_discounted_price(price, discount): # Validación de tipo if not isinstance(price, (int, float)) or not isinstance(discount, (int, float)): raise TypeError("El precio y el descuento deben ser números") # Validación de valor if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") try: return price * (1 - discount) except Exception as e: raise Exception("Ha ocurrido un error inesperado: " + str(e))
def calculate_discounted_price(price, discount): # Tu código aquí 👈 list = [price, discount] for l in list: if not isinstance(l, (int, float)): raise TypeError('El precio y el descuento deben ser números') for l in list: if l < 0: raise ValueError('El precio y el descuento deben ser valores positivos') try: round(price * (1 - (discount/100)), 2) except Exception as e: raise e else: return round(price * (1 - (discount/1)), 2) pass
def calculate_discounted_price(price, discount): try: if type(price) not in [int, float] or type(discount) not in [int, float]: raise TypeError("El precio y el descuento deben ser números") if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") except Exception as e: return f"Ha ocurrido un error inesperado:, {str(e)}" else: return price * (1 - discount)
Alguien sabe por qué este código no pasa los tests? Mi logica me dice que en el try puedo hacer los if y raise, except para excepción general y else, cuando no hay errores, entonces retornar el precio descuentado.
No logro entender por qué se pide levantar una excepción dentro de otra, no le encuentro sentido al playground...
Para mí, la solución sería de este modo:
def calculate_average(numbers): try: return (sum(numbers)/len(numbers)) except ZeroDivisionError: return ("La lista está vacía") except TypeError: return ("La lista contiene elementos no numéricos")
def calculate_discounted_price(price, discount): # Tu código aquí 👈 if type(price) == str or type(discount) == str: raise TypeError("El precio y el descuento deben ser números") if price < 0 or discount < 0 : raise ValueError("El precio y el descuento deben ser valores positivos") try: return price - (price * discount) except Exception as e: return f"Ha ocurrido un error inesperado {e}"
🛡️🛡️Escudo anti-spoilers🛡️🛡️
Mi solución al reto:
def calculate_discounted_price(price, discount): if not (isinstance(price, (int, float)) and isinstance(discount, (int, float))): raise TypeError("El precio y el descuento deben ser números") if price <= 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") try: return price - (price * discount) except: raise Exception(f"Ha ocurrido un error inesperado")
def calculate_discounted_price(price, discount): if not isinstance(price, (int, float)) or not isinstance(discount, (int, float)): raise TypeError("El precio y el descuento deben ser números") if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") try: return (price*(1-discount)) except Exception as error: raise Exception("Ha ocurrido un error inesperado") if __name__ == '__main__': response = calculate_discounted_price(100, 0.2) print(response) #Output: 80.0 response = calculate_discounted_price(-50, 0.2) print(response) #ValueError: El precio y el descuento deben ser valores positivos response = calculate_discounted_price("50", 0.2) print(response) #ValueError: El precio y el descuento deben ser números
Mi código:
def calculate_discounted_price(price, discount): try: if not isinstance(price, (int, float)) or not isinstance(discount, (int, float)): raise TypeError("El precio y el descuento deben ser números") if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") discounted_price = price * (1 - discount) return discounted_price except ValueError as ve: raise ve except TypeError as te: raise te except Exception as e: raise Exception("Ha ocurrido un error inesperado: " + str(e))
Solución 😄. .
def calculate_discounted_price(price, discount): if not are_numbers(price, discount): raise TypeError( "El precio y el descuento deben ser números") if price < 0 or discount < 0: raise ValueError( "El precio y el descuento deben ser valores positivos") try: return price * (1 - discount) except Exception as e: raise Exception(e) def are_numbers(*args): return all(isinstance(val, (int, float)) for val in args)
Listo!!!!!!!!!!!!!!!!!
Precio = "0" Descuento = "0" while Precio == "0" or Descuento == "0": try: Precio = int(input("Precio del producto($):")) Descuento = int(input("Descuento del producto(%):")) except ValueError: print("El precio y el descuento deben ser números")
def Negocio(Precio,Descuento): try: TotalaPagar = Precio - Precio*Descuento/100 if TotalaPagar < 0: raise ValueError("El precio y el descuento deben ser valores positivos") else: print(f"El Valor a pagar es de ${TotalaPagar}")
except Exception: print("Ha ocurrido un error inesperado")
Negocio(Precio,Descuento)
Al principio, añadí el mensaje de error de ValueError tanto en mi línea 4 como en la 7. Después, me di cuenta de que podría funcionar si lo agregaba solo en la línea 7. Sin embargo, no estoy segura de si es correcto escribirlo de esa manera.
def calculate_discounted_price(price, discount): try: if price < 0 or discount < 0: raise ValueError return price*(1-discount) except ValueError: raise ValueError("El precio y el descuento deben ser valores positivos") except TypeError: raise TypeError("El precio y el descuento deben ser números") except: raise BaseException("Ha ocurrido un error inesperado")
def calculate_discounted_price(price, discount): if not isinstance(discount,(int,float)) or not isinstance(price,(int,float)) : raise TypeError("El precio y el descuento deben ser números") if price < 0 or discount < 0: raise ValueError("El precio y el descuento deben ser valores positivos") try: return price*(1-discount) except Exception as e: print("Ha ocurrido un error inesperado "+ str(e))
Para pasar todas las pruebas fue inportante testear primero la condición de que sea un número y después la condición de que no sea un valor negativo. Si lo hacia al revés no pasaba el último test "test_calculate_discounted_price_non_numeric_values"