def average(float_nums: list = [0]) -> float:
'''
Calcula el promedio de una lista de notas.
Lanza un ValueError si hay más de 4 notas utilizando "raise".
Captura errores de tipo automáticamente.
'''
try:
if len(float_nums) > 4:
raise ValueError("La lista no puede poseer más de 4 notas.")
calculus = round(sum(float_nums) / len(float_nums), 2)
return calculus
except TypeError:
return "No fue posible calcular el promedio del(la) estudiante. ¡Sólo se admiten valores numéricos!"
except ValueError as ve:
return str(ve)
finally:
print("La consulta ha concluido.")
Uso "raise" para el error personalizado de tipo ValueError en el que no queremos que se puedan ingresar más de 4 notas. Uso "try-exception" para el TypeError que será detectado automáticamente por Python.
try:
grades = [4.5, 7, 8.5, 9]
print(f'El promedio es: {average(grades)}')
except NameError:
print("No fue posible calcular el promedio del(la) estudiante. ¡Sólo se admiten valores numéricos!\nLa consulta ha concluido.")
Ahí agrego otro manejo de excepción, en el caso de que se ingresen, por ejemplo, caracteres, pero sin comillas. Ése sería un error del tipo NameError que no puede ser manejado dentro de la función "average", ya que es un error que no ocurre dentro de la función, sino antes de que se llame a la misma, en la línea donde se intenta crear la lista. Por eso, el try-except dentro de average() no lo puede atrapar, porque el error ni siquiera le da oportunidad a la función de empezar a ejecutarse.