Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
0
respuestas

[Sugerencia] Jerarquía de Errores

Hola! En esta clase se hace un ejemplo en el que se tienen dos posibles tipos de excepciones

try:
  notas = [7, 6, 7, 6, "10"]

  resultado = promedio(notas)
except TypeError:
  print("No fue posible calcular el promedio del estudiante. Solo se admiten valores numéricos!")
except ValueError as e:
  print(e)
finally:
  print("La consulta ha concluido")

En el video se menciona que, independientemente de si hay más de 4 elementos, el error que sale es el TypeError debido a la jerarquía de excepciones, sin embargo, esto no es cierto y depende de la implementación de la función

def promedio(lista: list=[0]) -> float:
  ''' Función para calcular el promedio de notas en una lista

  lista: list, default [0]
    Lista con las notas para calcular el promedio
  return = calculo: float
    Promedio calculado
  '''
  calculo = sum(lista) / len(lista)

  if len(lista) > 4:
    raise ValueError("La lista no puede poseer más de 4 notas")

  return calculo

En este ejemplo, la función "sum" que usa la lista se usa antes de la instrucción en donde se valida la longitud de la lista, es por ese motivo que siempre se lanza esta excepción, porque la otra instrucción no alcanza a ejecutarse.

Para que el otro error pueda ser detectado por el "try" que tenemos arriba, la función debería primero validar la longitud de la lista, de esta manera:

def promedio(lista: list=[0]) -> float:
  ''' Función para calcular el promedio de notas en una lista

  lista: list, default [0]
    Lista con las notas para calcular el promedio
  return = calculo: float
    Promedio calculado
  '''
  if len(lista) > 4:
    raise ValueError("La lista no puede poseer más de 4 notas")

  calculo = sum(lista) / len(lista)

  return calculo

Con esto hecho, ahora sí se obtendrán dos errores diferentes si la ejecución fuese

resultado = promedio([7, 6, 7, 6, "10"])  # ValueError
resultado = promedio([7, 6, 7, "10"])      # TypeError