Curso Avançado de Desenvolvimento Python
Capítulo
>
Nível
Tratamento de Exceções
Múltiplas Exceções
Objetivo
Coletar e armazenar corretamente alguns suprimentos médicos em caixas usando múltiplas exceções.
Os armazéns no telhado precisam ser reabastecidos; alguns dos suprimentos foram usados, mas nunca substituídos. Há um pedido feito para mais materiais em um memorando em um dos depósitos, seria uma boa ideia cuidar disso. Dito isto, há uma variedade de materiais que precisam ser organizados e armazenados em caixas.
Devido aos diferentes tipos de dados e à quantidade de materiais necessários para preencher as caixas, podemos encontrar vários erros. Podemos usar try / except para capturar quaisquer erros possíveis e corrigir alguns problemas, mas o que acontece quando há múltiplos erros possíveis que você pode encontrar em uma única operação? Para resolver isso, podemos especificar quais exceções estamos tentando capturar e usar múltiplas exceções.
Para começar, caminhe até a marca de X dourada e encare a porta, use a função open() para entrar no depósito. Uma vez dentro, caminhe até a marca de X escura e vire à direita para usar a função read() e verificar quais materiais e quantidades estão sendo encomendados no memorando sobre a mesa. Informações sobre constantes de lista estão escritas no memorando, incluindo os suprimentos e seus pedidos. Após isso, caminhe até a marca de X clara dentro do depósito, vire para a caixa e pegue a constante de lista pads dos materiais, usando a função collect(), assim: player.collect(pads).
Dentro do armazém, há estoques de "peroxide" e "isopropyl"; caminhe e colete todos eles, depois saia e dirija-se à marca de X escura sobre um tapete roxo. No tapete roxo, enquanto estiver de frente para a caixa, use a função collect() para pegar "water bottle", siga para a marca de X escura sobre o tapete amarelo e use a função collect() para pegar "glass bottle".
Agora que os itens foram coletados, é hora de cumprir o pedido e colocar todos os materiais dentro das caixas do armazém à direita. Para isso, primeiro armazenaremos: "water bottle", "peroxide" e "isopropyl" dentro de uma lista chamada supplies. Nas marcas de X escuras sobre os tapetes red, green e blue, usaremos as caixas para armazenar os suprimentos médicos. Para isso, configuraremos três listas: blue_crate = [], green_crate = [] e red_crate = [].
Antes de colocar todos os itens, devemos popular todas as listas com os materiais; para isso, usaremos um loop para iterar pelas listas e combiná-las em uma única lista. Isso colocará todos os supplies na lista e dividirá o número de itens de pads de acordo com o order do memorando no depósito.
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
Apesar disso, você notará que erros surgirão, mesmo com tudo sendo feito corretamente e o código estando correto. No entanto, eis o problema: a lista supplies possui apenas três (3) itens, mas o loop executa cinco (5) vezes, causando um Index Error. Enquanto isso, na lista pads, não só ela também possui apenas três (3) itens, mas um dos valores de order é 0, e qualquer número dividido por 0 causa um Zero Division Error, pois nenhum número pode ser dividido por 0 em matemática.
É aqui que múltiplas exceções são úteis; usamos os blocos de código try / except para capturar os erros e nos permitir continuar com o código. Dado que ocorrem dois erros, devemos identificar cada erro a fim de capturar as exceções específicas. Isso é feito expandindo os blocos de código except desta forma: except IndexError: e except ZeroDivisionError:. Por exemplo:
for x in range(5): try: blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x]) except IndexError: blue_crate.append("glass bottle") except ZeroDivisionError: blue_crate.append(0)
O Index Error é corrigido preenchendo os espaços faltantes na lista com "glass bottle" e o Zero Division Error é resolvido adicionando um valor de 0 caso a ação ilegal ocorra.
Faça isso para as listas blue_crate = [], green_crate = [] e red_crate = []. Caminhe até a marca de X escura sobre os tapetes blue, green e red e use a função place() para armazenar as listas nas caixas correspondentes, a fim de completar o nível.