Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom
Obsługa wyjątków
Wiele wyjątków
Cel
Zbierz i poprawnie przechowuj pewne medyczne materiały w skrzyniach, używając wielu wyjątków.
Magazyny na dachu wymagają uzupełnienia, niektóre materiały zostały wykorzystane, ale nigdy nie zostały zastąpione. W jednym z magazynów znajduje się nota z zamówieniem na więcej materiałów, warto się tym zająć. Oznacza to, że istnieje wiele różnych materiałów, które muszą być zebrane i przechowywane w skrzyniach.
Z powodu różnych typów danych i liczby materiałów potrzebnych do wypełnienia skrzyni, możemy napotkać różne błędy. Możemy użyć try / except, aby złapać potencjalne błędy i naprawić niektóre problemy, ale co się stanie, gdy w jednej operacji wystąpi wiele możliwych błędów? Aby temu sprostać, możemy określić, które wyjątki próbujemy złapać, i użyć wielu wyjątków.
Na początek, udaj się do złotego znaku X i skieruj się w stronę drzwi, używając funkcji open(), aby wejść do magazynu. Po wejściu, udaj się do ciemnego znaku X i skręć w prawo, aby użyć funkcji read() i sprawdzić, jakie materiały oraz w jakich ilościach są zamawiane w notatce leżącej na stole. Informacje o stałych listach znajdują się w notatce, w tym materiały i ich zamówienia. Gdy skończysz, udaj się do jasnego znaku X wewnątrz magazynu, skręć w stronę skrzyni i zbierz stałą listę pads z materiałami, używając funkcji collect(), w ten sposób: player.collect(pads).
W magazynie znajdują się zapasy "peroxide" oraz "isopropyl", udaj się tam i zbierz je wszystkie, następnie udaj się na zewnątrz i skieruj do ciemnego znaku X na fioletowym dywanie. Na fioletowym dywanie, stojąc naprzeciwko skrzyni, użyj funkcji collect() aby zebrać "water bottle", przejdź do ciemnego znaku X na żółtym dywanie i użyj funkcji collect(), aby zebrać "glass bottle".
Teraz, gdy przedmioty zostały zebrane, czas zrealizować zamówienie i umieścić wszystkie materiały wewnątrz skrzyń magazynowych po prawej stronie. Aby to zrobić, najpierw przechowamy: "water bottle", "peroxide" oraz "isopropyl" w liście nazwanej supplies. Na ciemnych znakach X na dywanach w kolorach: red, green i blue, użyjemy skrzyń do przechowywania materiałów medycznych. W tym celu utworzymy trzy listy: blue_crate = [], green_crate = [] oraz red_crate = [].
Przed umieszczeniem wszystkich przedmiotów musimy zapełnić wszystkie listy materiałami. W tym celu użyjemy pętli, aby iterować przez listy i połączyć je w jedną listę. To spowoduje dodanie wszystkich supplies do listy oraz podział liczby elementów pads zgodnie z zamówieniem w notatce z magazynu.
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
Mimo to zauważysz, że pojawiają się błędy, mimo że wszystko zostało wykonane poprawnie, a kod jest solidny. Oto problem: lista supplies zawiera tylko trzy (3) elementy, ale pętla wykonuje się pięć (5) razy, co powoduje wystąpienie błędu Index Error. Tymczasem lista pads`` nie tylko zawiera również tylko trzy (3) elementy, ale jedna z wartości zamówienia to 0– dowolna liczba podzielona przez0powoduje błąd ***Zero Division Error***, ponieważ żadna liczba nie może być dzielona przez0` w matematyce.
Tutaj przydatne okazują się liczne wyjątki. Używamy bloków try / except, aby złapać błędy i umożliwić dalsze wykonanie kodu. Ponieważ występują dwa rodzaje błędów, musimy zidentyfikować każdy z nich, aby złapać odpowiednie wyjątki. Dokonujemy tego, rozszerzając bloki except w następujący sposób: except IndexError: oraz except ZeroDivisionError:. Na przykład:
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)
Błąd Index Error zostaje rozwiązany przez uzupełnienie brakujących miejsc w liście wartością "glass bottle", natomiast błąd Zero Division Error rozwiązuje się poprzez dodanie wartości 0 w przypadku wystąpienia niedozwolonej operacji.
Wykonaj to dla list: blue_crate = [], green_crate = [] oraz red_crate = []. Udaj się do ciemnego znaku X na dywanach blue, green oraz red i użyj funkcji place(), aby umieścić listy w odpowiadających im skrzyniach, aby ukończyć poziom.