Vai al contenuto
Leo

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.

  • 7 minuti di lettura
  • Livello: base
  • 11 esempi verificati

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:

voti.leoeseguito con Leo
variabile totale = 0per ogni voto in [7, 8, 6] fai    totale += votofinestampa(tottale)
Messaggio di Leo
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.

abitudini.leoeseguito con Leo
print("Ciao")
Messaggio di Leo
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#

ErroreQuando succedeEsempio
ErroreSintassiil codice non rispetta la grammatica di Leo (si vede prima di eseguire)manca fine o allora
ErroreNomevariabile o funzione non definitastampa(tottale)
ErroreTipooperazione tra tipi che non vanno d'accordo"3" + 4
ErroreValoreil tipo è giusto ma il valore nointero("ciao")
ErroreIndiceposizione fuori dalla lista[1, 2][5]
ErroreChiavechiave assente nel dizionario{"a": 1}["b"]
ErroreDivisionedivisione per zero10 / 0
ErroreRicorsioneuna funzione chiama se stessa più di 1.000 voltemanca il caso base
ErroreFilefile inesistente o non leggibile, problemi di reteleggi_file("manca.txt")
tipi.leoeseguito con Leo
variabile anni = "16"stampa(anni + 1)
Messaggio di Leo
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.

conto.leoeseguito con Leo
variabile prezzo = 10stampa(prezzo più 2)
Messaggio di Leo
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.

SvistaSi può scrivereForma consigliata
allora e fai scambiatise x > 0 fai, mentre i < 3 allorase x > 0 allora, mentre i < 3 fai
maiuscole dei nomiContatore += 1 dopo variabile contatore = 0contatore += 1
colori senza virgoletteFinestra1.sfondo = rossoFinestra1.sfondo = "rosso"
eventi all'inglesequando Pulsante1.click faiquando Pulsante1.clic fai
tollerante.leoeseguito con Leo
variabile contatore = 0mentre contatore < 3 allora    Contatore += 1finese contatore == 3 fai    stampa("Funziona lo stesso!")fine
Uscita
Funziona 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…

sinonimi.leoeseguito con Leo
variabile n = 0finché n < 3 fai    n += 1terminaqualora n == 3 allora    stampa("Arrivato a tre")sennò    stampa("Qualcosa non va")termina
Uscita
Arrivato 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.

rigoroso.leoeseguito con Leo
variabile x = 5se x > 0 fai    stampa("positivo")fine
Messaggio di Leo
ErroreSintassi 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ì:

Prompt dei comandi
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.

eta.leoeseguito con Leo
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.")fine
Uscita
Quanti anni hai? sedici
Serve un numero: Non posso trasformare il testo "sedici" in un intero.
Fatto.
  • cattura Tipo come nome cattura solo quel tipo di errore; cattura come nome li cattura tutti. Vince la prima clausola adatta.
  • infine si esegue sempre, con o senza errore.
  • Un errore catturato ha i campi tipo, messaggio, riga, colonna e suggerimento.

Con lancia segnali tu un errore, per esempio quando un dato non ha senso:

voto.leoeseguito con Leo
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)fine
Uscita
Il 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.

verifica.leoeseguito con Leo
funzione doppio(n)    restituisci n * 2fineverifica doppio(21) == 42verifica doppio(2) == 5, "doppio di 2 dovrebbe dare 4"
Messaggio di Leo
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:

  1. Apri il file nell'editor e premi F10: il programma parte e si ferma sulla prima riga, illuminata in arancione.

  2. 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"».

  3. 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.

  4. 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.

somma_sbagliata.leoeseguito con Leo
variabile totale = 0variabile i = 1mentre i < 5 fai    totale += i    i += 1finestampa(totale)
Uscita
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).