
Imparare a Programmare in Python – 10 – Gestione Errori ed Eccezioni: Gestire gli errori con l’utilizzo delle eccezioni in Python.
Imparare a Programmare in Python – Gestione Errori ed Eccezioni
Quando si crea un programma è inevitabile che ci sia la possibilità che vengano generati degli errori. Per gli errori più gravi ed evidenti, abbiamo l’aiuto del compilatore che ci segnala il problema e non permette di avviare il programma, ma ci sono altri tipi di errori che non possono essere evitati, ma possono essere previsti.
Ad esempio il programma potrebbe dover accedere ad un file, questo file potrebbe essere bloccato o non presente. Se non prevediamo questa possibilità e proseguiamo con il programma, ad un certo punto quando il programma dovrà utilizzare questo file, non potendo farlo si bloccherà.
Per questo motivo è fondamentale prevedere qualsiasi errore possa venire generato dall’utilizzo del programma, questo ovviamente include input errati da parte degli utenti, problemi con il sistema operativo che potrebbe non concedere i permessi necessari al programma, file non presenti, accesso al database non riuscito.
Per quanto possibile è sempre meglio valutare prima diverse possibilità e scrivere il codice in modo che gli errori siano rari, ma ovviamente non è possibile prevedere tutti i casi di utilizzo, per questo motivo è fondamentale creare un blocco di codice che andrà a gestire gli errori nel caso dovessero verificarsi.
Blocco Try
Il blocco Try, permette di inserire al suo interno tutto quel codice che potrebbe generare degli errori, quindi in caso di errore ci offre la possibilità di eseguire delle operazioni.
Vediamo un esempio:
numero1 = 10
try:
# controlla che numero2 sia un numero intero
numero2 = input("Inserisci un numero da 1 a 10: ")
except ValueError:
print("ValueError! Il carattere inserito non è un numero, verrà usato il valore 0")
numero2 = 0
except TypeError:
print("ValueError! Il carattere inserito non è un numero, verrà usato il valore 0")
numero2 = 0
risultato = numero1 + numero2In questo esempio chiediamo all’utente di inserire un valore e lo assegniamo alla variabile numero2.
Questo codice presenta 2 problemi:
- Gli input salvano sempre il loro contenuto come stringhe, quindi in questo caso numero2 sarà una stringa e non un numero intero
- L’utente potrebbe inserire una lettera
In entrambi i casi il programma restituirebbe un errore e smetterebbe di funzionare.
Utilizzando except andiamo a gestire gli errori, vediamo che abbiamo 2 except:
- ValueError
- TypeError
Queste 2 eccezioni catturano questi 2 problemi, per ogni Except possiamo utilizzare un tipo di eccezione che potrebbe verificarsi, e inserire il codice da eseguire nel caso si verificasse questo errore.
abbiamo anche la possibilità di utilizzare except senza specificare il tipo di errore, ad esempio:
numero1 = 10
try:
# controlla che numero2 sia un numero intero
numero2 = input("Inserisci un numero da 1 a 10: ")
except:
print("Errore! Il carattere inserito non è un numero, verrà usato il valore 0")
numero2 = 0
risultato = numero1 + numero2Solitamente è sconsigliato questo utilizzo, perché l’eccezione è troppo generica, cattura qualsiasi tipo di errore e non ci permette di avere chiaro il motivo per cui si è verificata questa eccezione, rendendo più difficile gestirlo.
Except – Else – Finally
Abbiamo visto che in un blocco Try, l’utilizzo di Except ci permette di catturare gli errori e gestire l’eccezione, quindi eseguire un codice particolare al verificarsi di questo errore.
Abbiamo altri 2 elementi facoltativi per il blocco Try, che sono Else e Finally.
numero1 = 10
try:
# controlla che numero2 sia un numero intero
numero2 = input("Inserisci un numero da 1 a 10: ")
except ValueError:
print("ValueError! Il carattere inserito non è un numero, verrà usato il valore 0")
numero2 = 0
else:
print("Non si sono verificate eccezioni quindi eseguo questo codice")
finally:
print("questo codice viene eseguito sempre alla fine del blocco try, sia con eccezioni, sia senza")
risultato = numero1 + numero2Else
L’else è un elemento facoltativo del blocco try, possiamo utilizzarlo se vogliamo che venga eseguito del codice SOLO nel caso in cui NON ci siano stati errori.
Finally
Anche il finally è un blocco facoltativo, e viene utilizzato per eseguire un codice al termine del try, sia che ci siano stati errori sia che non ci siano stati.
Il blocco finally è utile, ad esempio, per chiudere delle connessioni aperte.
Se nel try abbiamo aperto una connessione ad un database o ad un file, nel finally possiamo chiudere queste connessioni, che magari nel caso si siano verificati errori potrebbero essere rimaste aperte.
Controllare il tipo della variabile
Per evitare errori o problemi abbiamo anche la possibilità di controllare che una variabile sia di un determinato tipo.
Il controllo del tipo di variabile non esclude l’utilizzo del blocco try, che permette di gestire le eccezioni ed evitare blocchi del programma, ma è uno strumento extra utile per verificare che una variabile sia effettivamente del tipo che dobbiamo utilizzare.
#ESEMPI
if isinstance(numero2, int):
print("La variabile è un numero intero")
if isinstance(numero2, str):
print("La variabile è una stringa")
if isinstance(numero2, bool):
print("La variabile è una booleana")
#ESEMPIO DI UTILIZZO
if isinstance(numero2, str):
print("La variabile è una stringa")
numero2 = int(numero2)In questo caso abbiamo 3 esempi nei quali verifichiamo semplicemente che la variabile sia del tipo che vogliamo.
Nel 4 caso, invece controlliamo se la variabile è una stringa e quindi la convertiamo in numero.
IMPORTANTE: la conversione in numero prevedere che l’utente abbia inserito un valore numerico, se avesse ad esempio inserito una lettera questa conversione porterebbe ad un errore.