Se trovi utile il mio blog sostienimi con una piccola donazione. GRAZIE

12 – Le eccezioni

INDICE ARTICOLI

Premetto che qualsiasi programma sviluppato con qualsiasi linguaggio (quindi vale anche per il Python) se ben progettato non dovrebbe mai generare errori del tipo divisioni per 0 oppure indici errati.
Quindi una buona progettazione della logica e l’implementazione degli opportuni controlli dovrebbero metterci al riparo da blocchi inattesi del nostro programma.
Ovviamente questo è vero tranne nel caso l’errore sia Hardware o di sistema.
Il python mette a disposizione le istruzioni try ed except per intercettare gli errori e fare in modo che il nostro programma non si blocchi ma gestisca nel modo che riteniamo più opportuno l’errore.
Le eccezioni più comuni in un programma potrebbero essere quelle che vi riporto sotto :

Divisione per zero

>>> print 55/0
ZeroDivisionError: integer division or modulo

Richiesta di un’elemento di una lista con indice errato

>>> a = []
>>> print a[5]
IndexError: list index out of range

Richiesta di una chiave inesistente in un dizionario

>>> b = {}
>>> print b['pippo']
KeyError: pippo

Nei casi sopra riportati l’interprete Python arresta l’esecuzione del vostro programma segnalandovi l’errore riscontrato.
Il messaggio di errore che viene restituito è composto di due parti: la categoria dell’errore e le specifiche, separati dai due punti.
Per gestire l’errore possiamo operare come nell’esempio sottoriportato dove viene richiesto ad un’operatore di inserire il nome di un file da aprire :

NomeFile = raw_input('Inserisci il nome del file: ')
try:
    f = open (NomeFile, "r")
except:
    print 'Il file', NomeFile, 'non esiste'

Nel caso si verifichi qualche eccezione, ad esempio che il file non esista, viene interrotta l’esecuzione del blocco try e viene eseguito il blocco except che ci segnala con un messaggio il problema.
Questo comportamento, ovvero la segnalazione dell’errore e l’interruzione dell’operazione in corso (ma non del programma), è sicuramente un comportamento auspicabile in un software invece del suo blocco con la visualizzazione di un errore da parte dell’interprete.

L’istruzione except può anche essere relativa ad una particolare eccezzione :

import sys
try:
    f = open(’myfile.txt’)
    s = f.readline()
    i = int(s.strip())
except IOError, (errno, strerror):
    print "Errore I/O (%s): %s" % (errno, strerror)
except ValueError:
    print "Non si può convertire il dato in un intero."
except:
    print "Errore inatteso:", sys.exc_info()[0]
    raise

Nel caso sopra riportato vengono gestiti in modo differente gli errori relativi all’IO da quelli relativi ad un errore di conversione (ValueError).
Come potete notare al fondo del codice vi è un except senza parametri che serve a gestire tutti gli errori che non ricadano nei due casi precedenti.
Nel caso si adotti un except senza parametri bisogna porvi particolare attenzione dato che in questo modo è facile mascherare un errore di programmazione vero e proprio.
L’istruzione try except puo essere completata (facoltativamente) con un else .
Il blocco di codice della sezione else verrà eseguito se durante l’esecuzione del codice della sezione try non verranno sollevate eccezioni.

import sys
try:
    f = open(’myfile.txt’)
    s = f.readline()
    i = int(s.strip())
except IOError, (errno, strerror):
    print "Errore I/O (%s): %s" % (errno, strerror)
except ValueError:
    print "Non si può convertire il dato in un intero."
except:
    print "Errore inatteso:", sys.exc_info()[0]
    raise
else
    print "Operazioni eseguite correttamente"
    f.close()

INDICE ARTICOLI