Anche se intimidatorio, l'errore rappresenta una parte cruciale della programmazione. Puoi utilizzare l'errore come opportunità per imparare a fare debug, per scoprire i limiti di un programma o per vedere rapidamente cosa non fare!
L'errore è normale
In Verse, errore ha un significato preciso. Non indica necessariamente che qualcosa non ha funzionato, ma rappresenta un modo per controllare le azioni del tuo programma.
Come hai visto nella Lezione 4 puoi scrivere del codice per formulare una domanda con risposta chiusa sì o no.
var Tired: logic = false
var WhatToWatch: string = “niente”
if (Tired?):
set WhatToWatch = “your eyelids”
else:
set WhatToWatch = “cartoons”
Print(“You should watch {WhatToWatch}”)
# Dovresti guardare i cartoni animati
Il codice utilizzato per porre la domanda è scritto sotto forma di espressione fallibile. Nell'esempio precedente, Tired? è un'espressione fallibile.
Le espressioni fallibili vengono utilizzate per evitare errori che potrebbero impedire al programma di funzionare. Ad esempio, come sai, la divisione per zero è impossibile. Se provi a eseguire questa operazione nel tuo codice, il programma potrebbe subire un arresto anomalo! Tuttavia, il seguente codice Verse funziona correttamente:
if (5/0):
Print("Wow!")
else:
Print("Non puoi farlo!")
Per evitare questo tipo di errori, Verse ti richiede di scrivere le espressioni fallibili in un contesto di errore. I contesti di errore forniscono un luogo sicuro per le espressioni fallibili. Nell'esempio precedente, 5/0 è l'espressione fallibile e if() è il contesto di errore. Continua a leggere per saperne di più su questi due concetti di Verse.
Espressioni fallibili
Esistono numerosi modi di scrivere espressioni fallibili in Verse. Se un'espressione pone una domanda del tipo sì o no, probabilmente è fallibile.
Ecco alcuni tipi di domande poste dalle espressioni fallibili:
- Queste due variabili sono maggiori, minori o uguali tra loro?
- Questa variabile è impostata su
true? - Questa variabile è impostata su un valore?
- Questa espressione genera un errore?
Se la risposta a una qualsiasi di queste domande è sì, l'espressione ha esito positivo. Se invece la domanda è no, l'espressione ha esito negativo. Il successo o l'errore dell'espressione dipendono dal modo in cui viene scritto il codice.
Espressioni di confronto
Le espressioni di confronto che utilizzano operatori di confronto come < (minore di), > (maggiore di) o <> (diverso da) sono fallibili. Nell'esempio seguente, 5 < 4 è un'espressione fallibile che ha esito negativo:
if (5 < 4):
Print(“Non verrà mai stampato.”)
L'espressione 5 < 4 equivale a chiedere “5 è minore di 4?”. Poiché la risposta è no, l'espressione non riesce e il blocco di codice (indentato sotto l'espressione if) non viene eseguito.
Diamo un'occhiata al seguente esempio e all'espressione fallibile MousetrapsSet <> MiceCaught. La domanda che viene posta è: “I valori di MousetrapsSet e MiceCaught sono diversi?”.
MousetrapsSet := 3
MiceCaught := 0
if (MousetrapsSet<>MiceCaught):
Print(“Serve più formaggio!”)
Questa volta, la risposta alla domanda è sì perché MousetrapsSet è 3 e MiceCaught è 0, quindi l'espressione ha esito positivo e il blocco di codice viene eseguito.
Espressioni decisionali
Le espressioni decisionali che utilizzano gli operatori and, or e not sono fallibili. Nell'esempio seguente, MousetrapsForSale > 0 e Coins >= MousetrapCost è un'espressione fallibile che ha esito positivo perché MousetrapsForSale è 5 (maggiore di 0), Coins è 30 e MousetrapCost è 20 (30 è maggiore di 20). Entrambe le espressioni hanno esito positivo in autonomia, quindi l'intera espressione ha esito positivo.
MousetrapsForSale := 5
MousetrapCost := 20
Coins := 30
if (MousetrapsForSale > 0 and Coins >= MousetrapCost):
Print(“Puoi acquistare trappole per topi.”)
Espressioni di richiesta
Anche le espressioni di richiesta sono fallibili. Utilizzano l'operatore ? per verificare determinati valori, ad esempio se un valore logic è impostato su true. Nell'esempio seguente, MousetrapStoreOpen? è un'espressione fallibile che avrà esito negativo dal momento che MousetrapStoreOpen è impostato su false.
var MousetrapStoreOpen : logic = false
if (MousetrapStoreOpen?):
Print(“Dacci dentro!”)
Contesti di errore
In tutti gli esempi di codice precedenti, l'espressione if era il contesto di errore per le espressioni fallibili tra parentesi (). I contesti di errore forniscono un luogo sicuro per le espressioni fallibili in quanto determinano cosa succede se non riescono.
Nella lezione precedente hai visto che quando un'espressione if non riesce, il codice nel blocco if non viene eseguito.
Poiché if crea un contesto di errore, puoi inserire tutte le espressioni fallibili che vuoi nel suo blocco di codice. Se una di queste espressioni non riesce, le espressioni precedenti nel blocco di codice vengono annullate o ripristinate.
Esiste un altro modo per scrivere le espressioni if senza utilizzare le parentesi (). Risulta più utile se è necessario scrivere un gran numero di espressioni. Ecco un esempio:
MousetrapsSet:int = 5
var MiceCaught:int = 0
var BreakTime:logic = false
if:
MousetrapsSet > 0
set BreakTime = true
MiceCaught > 0
if (BreakTime?):
Print("Fai una pausa!")
else:
Print("Cattura qualche topo!")
Tutte le espressioni in un contesto di errore non devono essere necessariamente fallibili, ma almeno una di esse deve esserlo. Nell'esempio precedente, set BreakTime = true non è fallibile, ma le altre espressioni lo sono.
Nel codice sopra riportato, ogni espressione indentata sotto if è all'interno del contesto di errore. Vengono eseguite tutte e tre le espressioni.
MousetrapsSet > 0ha un esito positivo.- L'espressione
set BreakTime = trueviene eseguita. Non è fallibile quindi non viene sottoposta a un controllo dell'errore. - However,
MiceCaught > 0ha esito negativo.
Dal momento che si è verificato un errore, ogni espressione nel blocco di codice if viene annullata, compreso set BreakTime = true. Sembrerà che il codice non sia mai stato eseguito. Eseguendo questo codice, visualizzerai come messaggio stampato “Cattura qualche topo!”.
Durante la programmazione, ti accorgerai che gran parte del codice funziona solo se altre parti del codice vengono eseguite correttamente. Questo è un altro motivo per cui i contesti di errore sono così utili. Raggruppando il codice dipendente in contesti di errore, puoi evitare alcuni bug comuni. Nella Lezione 4 hai scritto del codice per decidere se andare o meno al cinema. Ora che hai deciso di andarci con i tuoi amici, devi comprare loro i biglietti, le bibite e gli snack!
var Drinks:int = 4
var Snacks:int = 4
var Tickets:int = 3
var FriendsAvailable:int = 4
if:
Drinks >= FriendsAvailable
set Drinks -= FriendsAvailable
Snacks >= FriendsAvailable
set Snacks -= FriendsAvailable
Tickets >= FriendsAvailable
set Tickets -= FriendsAvailable
Print("Bevande rimaste: { Drinks }")
Print("Snack rimasti: { Snacks }")
Print("Biglietti rimasti: { Tickets }")
L'operatore -= è una scorciatoia per combinare sottrazione e assegnazione. Nell'esempio precedente, set Tickets -= FriendsAvailable è equivalente a set Tickets = Tickets - FriendsAvailable. Funziona ugualmente con operazioni di addizione (+=), moltiplicazione (*=) e divisione (/=).
Hai abbastanza bevande e snack per i tuoi amici, ma non abbastanza biglietti. Di conseguenza, tu e i tuoi amici non potete vedere il film. Puoi scrivere del codice per gestire questa situazione, ma probabilmente non vuoi rinunciare alle bibite e ai dolci.
Per fortuna, quando l'espressione Tickets >= FriendsAvailable viene eseguita non riesce e tutto il codice del blocco if viene annullato. Questo significa che le variabili Drinks e Snacks tornano entrambe al valore 4.
Riepilogo
- In Verse, l'errore rappresenta un modo per controllare le azioni del tuo programma.
- Le espressioni fallibili possono riuscire o non riuscire e devono essere scritte in un contesto di errore. Quello che succede in seguito a un'operazione riuscita o a un errore dipende da come è scritto il codice. I contesti di errore forniscono un luogo sicuro per le espressioni fallibili. Qualsiasi errore che si verifica in un contesto di errore causa il ripristino del codice in quel contesto, come se non fosse mai stato eseguito.