Corso Avanzato di Sviluppo Python
Capitolo
>
Livello
Gestione delle eccezioni
Eccezioni Multiple
Obiettivo
Raccogli e conserva correttamente alcuni materiali medici in casse utilizzando eccezioni multiple.
I depositi sul tetto devono essere riforniti, alcuni dei materiali sono stati usati ma non sono mai stati sostituiti. Esiste un ordine per ulteriori materiali in un memo in uno dei magazzini, quindi sarebbe una buona idea occuparsene. Detto questo, ci sono una varietà di materiali diversi che devono essere messi insieme e conservati in casse.
A causa dei diversi tipi di dati e del numero di materiali necessari per riempire le casse, possiamo incorrere in vari errori. Possiamo utilizzare try / except per catturare eventuali errori e risolvere alcuni problemi, ma cosa succede quando in un'unica operazione possono verificarsi più errori? Per risolvere questo problema possiamo specificare quali eccezioni vogliamo catturare e usare eccezioni multiple.
Per iniziare, dirigiti verso il segno a X dorato e affronta la porta, usando la funzione open() per entrare nel magazzino. Una volta dentro, dirigiti verso il segno a X scuro e gira a destra per utilizzare la funzione read() e controllare quali materiali e quantità sono ordinati nel memo sul tavolo. Nel memo sono indicate le costanti di lista, inclusi i materiali e i relativi ordini. Una volta fatto, dirigiti verso il segno a X chiaro all'interno del magazzino, gira verso la cassa e prendi la costante di lista pads dei materiali al suo interno utilizzando la funzione collect(), in questo modo: player.collect(pads) .
All'interno del magazzino ci sono scorte di "peroxide" e "isopropyl", cammina e raccogli entrambe, poi esci e dirigiti verso il segno a X scuro sopra un tappeto viola. Sul tappeto viola, mentre affronti la cassa, usa la funzione collect() per prelevare "water bottle", poi dirigiti verso il segno a X scuro sopra il tappeto giallo e usa la funzione collect() per prelevare "glass bottle".
Adesso che gli oggetti sono stati raccolti, è ora di evadere l'ordine e posizionare tutti i materiali nelle casse del magazzino a destra. Per fare questo, immagazzineremo prima: "water bottle", "peroxide" e "isopropyl" all'interno di una lista chiamata supplies. Sui segni a X scuri sopra i tappeti red, green e blue useremo le casse per conservare i materiali medici. Per questo, creeremo tre liste: blue_crate = [], green_crate = [] e red_crate = [].
Prima di posizionare tutti gli oggetti, dobbiamo popolare tutte le liste con i materiali; per questo useremo un ciclo per iterare attraverso le liste e combinarle in un'unica lista. Questo metterà tutti i supplies nella lista e dividerà il numero di elementi pads in base all'order scritto nel memo nel magazzino.
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
Nonostante questo, noterai che appariranno degli errori, pur essendo tutto eseguito correttamente e il codice solido. Tuttavia, ecco il problema: la lista supplies contiene solo tre (3) elementi, ma il ciclo viene eseguito cinque (5) volte causando un Index Error. Nel frattempo, la lista pads non solo contiene anch'essa solo tre (3) elementi, ma uno dei valori dell'ordine è 0, e qualsiasi numero diviso per 0 porta ad un Zero Division Error, poiché in matematica nessun numero può essere diviso per 0.
È qui che le eccezioni multiple risultano utili: utilizziamo i blocchi di codice try / except per catturare gli errori e permettere al codice di continuare. Dal momento che si verificano due errori, dobbiamo identificarli per catturare le eccezioni specifiche. Questo si fa ampliando i blocchi except in questo modo: except IndexError: e except ZeroDivisionError:. Per esempio:
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)
L'Index Error viene corretto riempiendo gli spazi mancanti nella lista con "glass bottle" e l'Zero Division Error viene gestito aggiungendo un valore di 0 se si verifica l'azione illegale.
Fai lo stesso per le liste blue_crate = [], green_crate = [] e red_crate = []. Dirigiti verso il segno a X scuro sopra i tappeti blue, green e red e usa la funzione place() per posizionare le liste nelle casse corrispondenti, completando così il livello.