Curso Avanzado de Desarrollo en Python
Capítulo
>
Nivel
Manejo de Excepciones
Resumiendo una excepción
Objetivo
Dirígete a la oficina y asegúrate de que el suministro de dinero esté debidamente balanceado utilizando el bloque de código finally y la palabra clave assert.
En lo profundo del segundo piso, una oficina está dedicada a almacenar fondos para futuras inversiones de la granja. Ya es hora de hacer un chequeo y asegurarse de que todos los libros estén balanceados. Cuando se trabaja con números, los errores matemáticos y otros problemas están destinados a ocurrir, por lo que, una vez más, el manejo de excepciones es una buena idea para detectar y resolver errores.
Además de los bloques de código try / except y else, también existe el bloque de código finally que te permite finalizar una excepción. Además de esto, la palabra clave assert es una función de depuración que te permite verificar si un código tiene algún error, permitiéndote corregir el código defectuoso.
Comienza caminando hacia la marca de X clara frente a la puerta de la oficina y utilizando la función open() para abrir la puerta y entrar. Una vez adentro, dirígete a la marca de X dorada y utiliza la función collect() para recoger dos constantes diferentes llamadas: categories y savings. La constante categories es una lista que contiene el suministro de dinero de las tres categorías, llamadas: "exports", "imports", "stock", que deben ser verificadas. La constante savings es una variable que contiene el suministro de dinero que puede ser necesario para asegurar que las arcas estén debidamente abastecidas.
Ahora que se han recogido todos los elementos necesarios, es hora de balancear el suministro de dinero almacenado en sacos que serán recogidos y distribuidos por un empleado después de que termines. Camina hacia la marca de X oscura sobre la alfombra blue, para las marcas de X sobre las alfombras blue, yellow y red. Aquí utilizaremos la constante de lista categories para verificar que cada saco tenga todos los componentes necesarios antes de ser enviado.
Se supone que cada saco debe contener los componentes que se encuentran dentro de la lista categories. Existen tres constantes de diccionario que corresponden a cada saco: blue_sack, yellow_sack y red_sack. Ejecuta un bucle for mientras estás parado sobre la marca de X en la alfombra blue para verificar que el saco tenga todos los materiales requeridos y luego confirmar que el suministro está contabilizado.
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
Algunos de los sacos deberían tener todos los materiales requeridos, pero como de costumbre en estos ejercicios, podrías encontrarte con un error. Si encuentras un problema, debes usar los bloques de código try / except para capturar el error, en este caso siendo un KeyError:, que ocurre si no se encuentra una clave en el diccionario. Cuando esto suceda, también añadimos finally a la excepción, lo que finaliza la excepción añadiendo un código que siempre se ejecuta al final de cada manejo de excepciones. A diferencia de las excepciones, solo puede haber un bloque finally por cada try. Por ejemplo, en el caso de blue_sack:
try: for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) except: player.speak("Bag is missing %s, adding now" % (categories[x])) player.place(categories[x]) finally: player.speak("All assets accounted for")
Repite este proceso en las marcas de X oscuras sobre las alfombras yellow y red, utilizando las constantes de diccionario yellow_sack y red_sack. Puede que no sea necesario en algunos casos, ya que el error ocurre solo si falta un elemento en los sacos.
Ahora que se han verificado los sacos, es hora de pasar a los cofres que se encuentran frente a las alfombras: green, purple y orange. Aquí debemos asegurar que el suministro de dinero sea exactamente 30 en cada cofre y luego cerrarlos. Existen tres constantes variables correspondientes a cada cofre, llamadas: green_chest, purple_chest y orange_chest.
El mayor problema al verificar los cofres es que no conocemos su contenido exacto; cuando se trabaja con valores desconocidos se puede usar la palabra clave assert. Esta palabra clave te permite verificar si una afirmación que estás declarando es verdadera o falsa, lo cual es muy útil para detectar si tu código tiene algún error. La palabra clave assert se utiliza en conjunción con: try, except, else y finally y sus diversas combinaciones para reparar código con errores. Por ejemplo, en el caso de green_chest:
try: assert(green_chest = 30) except AssertionError: player.speak("Chest is not full %s/30" % green_chest) drop = 30-green_chest savings -= drop player.place(drop) else: player.speak("All assets accounted for") finally: player.close()
En el código anterior verificamos si green_chest contiene la cantidad adecuada de suministro de dinero utilizando la palabra clave assert. Si no contiene la cantidad correcta, se activa el bloque except y se calcula y se sustrae el suministro faltante de la variable savings y se añade al cofre. Si el suministro está completo, se activa el bloque else y se confirma que todos los activos están contabilizados. Una vez que todo se verifica, se ejecuta el bloque finally y se inicia la función close() para cerrar el cofre.
En las marcas de X sobre las alfombras green, purple y orange, colócate frente a los cofres y ejecuta la verificación usando: green_chest, purple_chest, orange_chest en las alfombras de los colores respectivos. Una vez finalizado, camina hacia la marca de X clara y utiliza la función place() para almacenar el resto de la variable savings en la caja con el fin de completar el nivel.