Corso Avanzato di Sviluppo Python
Capitolo
>
Livello
Gestione delle eccezioni
Eccezioni personalizzate
Obiettivo
Utilizza eccezioni personalizzate per raccogliere messaggi con ordini di prodotto e inviarli tramite piccione viaggiatore.
Alcuni messaggi vengono distribuiti in tutta la fattoria e in altre stazioni tramite piccione mensaggero; potrebbe essere una buona idea inviarne alcuni per rimanere in anticipo rispetto al programma. Finora abbiamo intercettato errori usando eccezioni comuni, ma talvolta può essere utile creare delle eccezioni personalizzate per scenari molto specifici. Andremo a reperire i messaggi e a selezionare i piccioni identificando gli elementi corretti utilizzando le nostre eccezioni personalizzate.
Le eccezioni personalizzate vengono create definendo delle classi; aggiungendo la clausola (Exception) è possibile riutilizzare una classe per gestire eccezioni. Per i nostri scopi creeremo due classi: InvalidLocation, che viene attivata quando una determinata stringa non supera la verifica, e UnsuitableSelection, che viene usata per controllare se un numero supera una certa soglia.
class InvalidLocation(Exception):
"Raised when location is invalid"
pass
class UnsuitableSelection(Exception):
"Raised when pidgeon is 2 or younger"
pass
Ora che le classi sono pronte, è il momento di andare a prendere i promemoria affinché possano essere inviati. Crea una lista chiamata prep per memorizzare e combinare i componenti necessari per lo scambio imminente. Cammina verso il marchio X scuro sul tappeto rosso; sulla fila di tavoli con i marchi a X davanti, cercheremo i promemoria destinati al settore occidentale della fattoria.
In questo segmento vengono usate quattro costanti variabili: red_memo, blue_memo, green_memo e orange_memo. Solo i promemoria contrassegnati per essere consegnati nel settore "west" devono essere raccolti per poter essere inviati. Per determinare se prendere o meno il promemoria, utilizzeremo i blocchi di codice try/except e else in combinazione con l'eccezione personalizzata InvalidLocation. Per usare l'eccezione personalizzata, fai in modo che il blocco try verifichi se il promemoria è etichettato come "west" e, in caso contrario, sollevi l'eccezione. Il blocco except conferma che il promemoria non è valido, mentre il blocco else lo raccoglie e lo aggiunge alla lista prep, se risulta destinato al settore "west". Per esempio:
try: if red_memo != "west": raise InvalidLocation except InvalidLocation: player.speak("This is not an order that needs to be sent out") else: player.collect(red_memo) prep.append(red_memo)
Cammina verso ciascuno dei marchi X scuri sul tappeto colorato davanti ai tavoli ed esegui la sequenza di eccezioni utilizzando le costanti variabili corrispondenti a ciascun colore.
Una volta raccolti i promemoria, cammina verso il marchio X dorato davanti alla porta ed usa la funzione open() per accedere ai piccionai. Una volta all'interno, cammina verso il marchio X chiaro, gira, ed utilizza la funzione close() per chiudere la porta, assicurandoti così che nessun piccione fugga.
Cammina verso il marchio X scuro sul tappeto viola; sui recinti verificheremo se il piccione ha l'età sufficiente per consegnare un messaggio o se è un pulcino incapace di effettuare la consegna. In questo segmento verranno usate altre quattro costanti variabili: purple_pen, yellow_pen, white_pen e pink_pen, corrispondenti a ciascun tappeto colorato. Utilizzeremo la stessa tecnica impiegata per i promemoria, usando la seconda classe che abbiamo definito.
Utilizza i blocchi di codice try/except e else insieme all'eccezione personalizzata UnsuitableSelection per verificare se il piccione ha l'età idonea per effettuare la consegna. Il blocco try controlla se la costante variabile che rappresenta il recinto contiene un piccione adatto, verificando se l'uccello ha meno di due (2) anni. Se il piccione non è adatto, viene attivato il blocco except; altrimenti, il blocco else viene eseguito permettendoti di aggiungere un piccione alla lista prep per consegnare il messaggio.
try: if purple_pen <= 2: raise UnsuitableSelection except UnsuitableSelection: player.speak("Pigeon unsuitable to deliver") else: prep.append(purple_pen) player.speak("Pigeon Collected")
Vai verso ciascun marchio X scuro sul tappeto colorato ed usa questa sequenza con la corretta costante variabile corrispondente al rispettivo tappeto colorato. Una volta raccolti i piccioni e i messaggi, cammina verso il marchio X dorato in fondo e usa la funzione place() con la lista prep che hai creato per inviare i piccioni a consegnare i messaggi e completare il livello.