2.20 - Gestione errori.

Tipi di errori

Un algoritmo o un programma può contenere errori di varia natura. Se l’errore è grave può causare l’interruzione anticipata del programma: in tal caso si dice che il programma è andato in crash. L’errore in un programma viene chiamato bug (si legge “bag” e significa “insetto”) e l’operazione di trovarli e correggerli è detta debugging.


I computer sono nati negli anni 40. Erano grandi quanto una casa di tre piani e i loro componenti erano grandi e consumavano molta energia. Un giorno del 1947 il computer andò in errore a causa di una falena che aveva fatto saltare un circuito, per cui venne scritto “..first actual case of bug being found..”. Da allora in poi gli errori nei programmi sono detti bug.

Gli errori si dividono essenzialmente in tre tipi: errori sintattici, errori di tipo (datatype), errori logici.

Errori di sintassi.
La sintassi è l’insieme di regole in cui parole e simboli possono combinarsi tra di loro; pensa a tutte le regole che esistono per costruire una frase nel tuo linguaggio naturale. Le regole dei linguaggi di programmazione sono ancora più precise. Un errore di sintassi potrebbe essere, ad esempio, un errore di ortografia, la mancanza dei due punti alla fine dell’istruzione if o while, il riferimento a nomi di variabili inesistenti, e così via.

Errori di tipo.
Tali errori, detti datatype o dataerror avvengono quando si introducono operazioni tra tipi diversi; per esempio 2+”ciao”, a%b con a e b decimali, assegnare un valore ad un singolo elemento di una tupla, .....
(Attenzione!! 2*”ciao” produce come risultato “ciaociao”).

Gli errori sintattici vengono individuati da Python con il programma interno detto Parser che esegue un’analisi sintattica di tutte le istruzioni inserite nel programma sorgente. ESEMPI DI ERRORI SINTATTICI: parentesi non chiuse, due punti mancanti, nomi inesistenti.
Anche gli errori di sintassi di tipo sono evidenziati dal compilatore, per cui sono facilmente identificabili e di facile risoluzione.

Errori logici.
Si ha un errore logico, quando le istruzioni, anche se sintatticamente corrette, non restituiscono i valori che ci aspettavamo, per cui c’è un errore di progettazione: la logica del programma è sbagliata e dobbiamo rivederne il suo flusso ragionando attentamente sull’algoritmo proposto.

Abbiamo già analizzato un tipo di errore logico, detto off by one nel capitolo 2.14, Esempio 2. Il programma esatto è riportato nella figura seguente:


E se volessimo calcolare il prodotto dei primi N numeri (che si indica con N! e viene detto N fattoriale), su quali parti del codice dovremmo intervenire?
Utilizziamo innanzitutto la variabile prodotto in luogo di somma.
Poniamo inizialmente prodotto=1 e, ovviamente, usiamo il simbolo * al posto del +.
Il programma trasformato è il seguente:

che fornisce questo risultato.

Il prodotto è nullo perché la variabile conta parte da zero: nel prodotto basta una zero per rendere nullo il prodotto stesso!
Per risolvere il bug dobbiamo allora far partire il range da 1, quindi:

Il programma restituisce il valore esatto: se N=5, prodotto=120.
Una volta che il programma è terminato, esso può risultare utile anche in altre occasioni? Se la risposta è “si” lo possiamo trasformare in una funzione in cui N è il parametro di input.
All’aumentare di N il fattoriale diventa un numero molto elevato: gli altri linguaggi di programmazione hanno un limite massimo sui numeri interi, mentre Python lo calcola ugualmente! Prova con valori di N= 50 e 80.