06 Sezione 6 di 15
Errori e come leggerli
Sbagliare è normale, anche per chi programma da anni. Leo spiega ogni errore in italiano, indica la riga, propone la correzione e, quando può, sistema da solo gli errori di forma. Qui impari a sfruttare tutto questo.
Com'è fatto un messaggio d'errore#
Ogni messaggio ha quattro parti: il tipo e la posizione, la riga di codice con i segni ^^^ sotto il punto sbagliato, la spiegazione e un suggerimento. Ecco un programma con un errore di battitura:
variabile totale = 0per ogni voto in [7, 8, 6] fai totale += votofinestampa(tottale)ErroreNome alla riga 5, colonna 8 di voti.leo 5 | stampa(tottale) | ^^^^^^^ `tottale` non è definito. Suggerimento: forse intendevi `totale` (definito alla riga 1)? Riga corretta proposta: 5 | stampa(totale)
Leo ha capito che tottale somiglia a totale, definito alla riga 1, e te lo dice. I suggerimenti arrivano da tre fonti: nomi simili già definiti, parole che somigliano a una parola chiave e parole di altri linguaggi di programmazione.
print("Ciao")ErroreNome alla riga 1, colonna 1 di abitudini.leo 1 | print("Ciao") | ^^^^^ `print` non è definito. Suggerimento: In Leo si scrive `stampa`. Riga corretta proposta: 1 | stampa("Ciao")
I tipi di errore#
| Errore | Quando succede | Esempio |
|---|---|---|
ErroreSintassi | il codice non rispetta la grammatica di Leo (si vede prima di eseguire) | manca fine o allora |
ErroreNome | variabile o funzione non definita | stampa(tottale) |
ErroreTipo | operazione tra tipi che non vanno d'accordo | "3" + 4 |
ErroreValore | il tipo è giusto ma il valore no | intero("ciao") |
ErroreIndice | posizione fuori dalla lista | [1, 2][5] |
ErroreChiave | chiave assente nel dizionario | {"a": 1}["b"] |
ErroreDivisione | divisione per zero | 10 / 0 |
ErroreRicorsione | una funzione chiama se stessa più di 1.000 volte | manca il caso base |
ErroreFile | file inesistente o non leggibile, problemi di rete | leggi_file("manca.txt") |
variabile anni = "16"stampa(anni + 1)ErroreTipo alla riga 2, colonna 13 di tipi.leo 2 | stampa(anni + 1) | ^ Non posso sommare un `testo` e un `intero`. Suggerimento: Per unire un testo e un numero usa `testo(1)`.
Leo non trasforma mai da solo un testo in numero: scrivi intero(anni) + 1.
Messaggi più brevi per chi inizia#
Con l'opzione --semplice (leo programma.leo --semplice) i messaggi usano frasi brevi, mostrano la riga giusta dopo «Prova così:» e un piccolo esempio corretto. --consiglio aggiunge in fondo il consiglio del giorno.
variabile prezzo = 10stampa(prezzo più 2)Problema alla riga 2. 2 | stampa(prezzo più 2) ^^^ Leo non capisce come è scritta questa riga. Per i calcoli si usano i simboli: scrivi `+` al posto di `più`. Correzione proposta: 2 | stampa(prezzo + 2) Esempio giusto. I calcoli e i confronti si scrivono con i simboli: stampa(3 + 4) se x == 5 allora stampa("cinque") fine
Leo perdona le sviste più comuni#
Alcuni errori frequenti in chi inizia non fermano il programma: Leo capisce che cosa volevi dire e lo esegue come se fosse scritto nella forma consigliata.
| Svista | Si può scrivere | Forma consigliata |
|---|---|---|
allora e fai scambiati | se x > 0 fai, mentre i < 3 allora | se x > 0 allora, mentre i < 3 fai |
| maiuscole dei nomi | Contatore += 1 dopo variabile contatore = 0 | contatore += 1 |
| colori senza virgolette | Finestra1.sfondo = rosso | Finestra1.sfondo = "rosso" |
| eventi all'inglese | quando Pulsante1.click fai | quando Pulsante1.clic fai |
variabile contatore = 0mentre contatore < 3 allora Contatore += 1finese contatore == 3 fai stampa("Funziona lo stesso!")fineFunziona lo stesso!
Leo capisce anche dei sinonimi delle parole chiave, per scrivere in modo più naturale: finché per mentre, qualora per se, sennò per altrimenti, termina per fine, ritorna per restituisci, esci per interrompi, sì e no per vero e falso, niente per nulla…
variabile n = 0finché n < 3 fai n += 1terminaqualora n == 3 allora stampa("Arrivato a tre")sennò stampa("Qualcosa non va")terminaArrivato a tre
Nell'editor i sinonimi sono sottolineati con un tratteggio: passandoci sopra vedi la parola canonica. Ctrl+Maiusc+F (o leo formatta) riscrive tutto nella forma consigliata.
La modalità rigorosa#
A scuola, in un esame o in un lavoro di gruppo può servire che tutti scrivano il codice nello stesso modo. La modalità rigorosa accetta solo la forma canonica: niente sinonimi, niente tolleranze, nessuna correzione automatica. Ogni errore spiega che cosa sarebbe stato accettato fuori dalla modalità rigorosa.
variabile x = 5se x > 0 fai stampa("positivo")fineErroreSintassi alla riga 2, colonna 10 di rigoroso.leo 2 | se x > 0 fai | ^^^ Manca `allora` dopo la condizione di `se`. Suggerimento: In modalità rigorosa dopo la condizione di `se` si scrive `allora`, non `fai`. Riga corretta proposta: 2 | se x > 0 allora
Si accende in tre modi: leo programma.leo --rigoroso; nel progetto, con rigoroso = true nella sezione [esecuzione] di progetto.toml; per tutti i programmi, con la variabile d'ambiente LEO_RIGOROSO=1.
La correzione automatica#
Per gli errori di forma — un fine, allora o fai mancante, una parentesi o una virgoletta non chiusa, una virgola mancante in una lista, = al posto di ==, una parola chiave storpiata, variabile dimenticato alla prima assegnazione — Leo propone la correzione e la applica solo se rispondi sì:
Ho trovato 2 errori di forma in voti.leo:
riga 4: se media >= 18
proposta: se media >= 18 allora
riga 9: manca `fine` per il blocco `per ogni` aperto alla riga 6
proposta: inserire `fine` dopo la riga 8
Applico le correzioni? [s]ì [n]o [u]na alla volta [v]edi le differenze- Prima di modificare il file Leo ne salva una copia (
voti.leo.bak). - Non tocca mai la logica: nomi, valori e operazioni restano decisioni tue.
- In Leo Studio le stesse correzioni arrivano dalla lampadina accanto alla riga, o da Esegui → Correggi gli errori di forma….
- Con
--correggi=no(e in modalità rigorosa) la correzione automatica è spenta.
Gestire gli errori nel programma: prova e cattura#
Alcuni errori non dipendono da te: l'utente scrive una parola dove serviva un numero, un file manca, la rete non risponde. Con prova … cattura il programma reagisce invece di fermarsi.
prova variabile n = intero(chiedi("Quanti anni hai? ")) stampa("L'anno prossimo ne avrai {n + 1}")cattura ErroreValore come e stampa("Serve un numero: {e.messaggio}")cattura come e stampa("Errore imprevisto: {e.tipo}")infine stampa("Fatto.")fineQuanti anni hai? sedici
Serve un numero: Non posso trasformare il testo "sedici" in un intero.
Fatto.cattura Tipo come nomecattura solo quel tipo di errore;cattura come nomeli cattura tutti. Vince la prima clausola adatta.infinesi esegue sempre, con o senza errore.- Un errore catturato ha i campi
tipo,messaggio,riga,colonnaesuggerimento.
Con lancia segnali tu un errore, per esempio quando un dato non ha senso:
funzione controlla_voto(voto) se voto < 0 o voto > 10 allora lancia ErroreValore("Il voto deve essere tra 0 e 10, non {voto}") fine restituisci votofine prova controlla_voto(12)cattura ErroreValore come e stampa(e.messaggio)fineIl voto deve essere tra 0 e 10, non 12
E con verifica controlli al volo che una condizione sia vera: se non lo è, il programma si ferma mostrando i valori confrontati.
funzione doppio(n) restituisci n * 2fineverifica doppio(21) == 42verifica doppio(2) == 5, "doppio di 2 dovrebbe dare 4"ErroreValore alla riga 5, colonna 1 di verifica.leo 5 | verifica doppio(2) == 5, "doppio di 2 dovrebbe dare 4" | ^ Verifica non riuscita: doppio di 2 dovrebbe dare 4 Suggerimento: Ho controllato 4 == 5, ma è falso.
Trovare gli errori di logica: il passo passo#
Il programma parte, non dà errori… ma il risultato è sbagliato. È un errore di logica, e nessun messaggio può trovarlo per te. Qui aiuta il passo passo di Leo Studio:
Apri il file nell'editor e premi F10: il programma parte e si ferma sulla prima riga, illuminata in arancione.
Premi di nuovo F10 per eseguire un'istruzione alla volta. Nella tabella delle variabili quelle che cambiano lampeggiano in rosso, e sotto leggi che cosa è successo: «x passa da 1 a 2; nuova nome = "Ada"».
Con Continua (Ctrl+F10) il programma avanza da solo: scegli la velocità con il cursore VELOCITÀ, da Molto lenta (1,5 secondi per passo) a Massima.
Fai doppio clic su una variabile per vedere la sua storia, cioè tutti i valori che ha avuto.
Prova con questo programma, che dovrebbe sommare i numeri da 1 a 5 ma dà 10: seguendo i passo passo vedi subito che il 5 non viene mai sommato.
variabile totale = 0variabile i = 1mentre i < 5 fai totale += i i += 1finestampa(totale)10
Farsi raccontare il programma#
Non capisci che cosa fa un programma, magari scritto da qualcun altro? leo spiega programma.leo lo racconta in italiano, riga per riga (--semplice per un racconto più breve, --dettagli per uno più completo).