• Non ci sono risultati.

Eccezioni

Nel documento Pensare da informatico (pagine 131-135)

Se il programma si blocca a causa di un errore in esecuzione viene creata un’eccezione: l’interprete si ferma e mostra un messaggio d’errore.

Le eccezioni pi`u comuni per i programmi che hai visto finora possono essere: • la divisione di un valore per zero:

>>> print 55/0

ZeroDivisionError: integer division or modulo

• la richiesta di un elemento di una lista con un indice errato: >>> a = []

>>> print a[5]

IndexError: list index out of range

• la richiesta di una chiave non esistente in un dizionario:

>>> b = {}

>>> print b[’pippo’] KeyError: pippo

In ogni caso il messaggio d’errore `e composto di due parti: la categoria dell’errore e le specifiche separati dai due punti. Normalmente Python stampa la traccia del programma al momento dell’errore ma in questi esempi sar`a omessa per questioni di leggibilit`a.

Molte operazioni possono generare errori in esecuzione ma in genere desideriamo che il programma non si blocchi quando questo avviene. La soluzione `e quella di gestire l’eccezione usando le istruzioni try ed except.

Per fare un esempio possiamo chiedere ad un operatore di inserire il nome di un file per poi provare ad aprirlo. Se il file non dovesse esistere non vogliamo che il programma si blocchi mostrando un messaggio di errore; cos`ı cerchiamo di gestire questa possibile eccezione:

NomeFile = raw_input(’Inserisci il nome del file: ’) try:

f = open (NomeFile, "r") except:

print ’Il file’, NomeFile, ’non esiste’

L’istruzione try esegue le istruzioni nel suo blocco. Se non si verificano eccezioni (e cio`e se le istruzioni del blocco try sono eseguite senza errori) l’istruzione except ed il blocco corrispondente vengono saltate ed il flusso del programma prosegue dalla prima istruzione presente dopo il blocco except. Nel caso si verifichi qualche eccezione (nel nostro caso la pi`u probabile `e che il file richiesto

non esiste) viene interrotto immediatamente il flusso del blocco try ed eseguito il blocco except.

Possiamo incapsulare questa capacit`a in una funzione: FileEsiste prende un nome di un file e ritorna vero se il file esiste, falso se non esiste.

def FileEsiste(NomeFile): try: f = open(NomeFile) f.close() return 1 except: return 0

Puoi anche usare blocchi di except multipli per gestire diversi tipi di eccezioni. Vedi a riguardo il Python Reference Manual.

Con try/except possiamo fare in modo di continuare ad eseguire un program-ma in caso di errore. Possiamo anche “sollevare” delle eccezioni nel corso del programma con l’istruzione raise in modo da generare un errore in esecuzione quando qualche condizione non `e verificata:

def InputNumero() :

x = input (’Dimmi un numero: ’) if x > 16 :

raise ’ErroreNumero’, ’mi aspetto numeri minori di 17!’ return x

In questo caso viene generato un errore in esecuzione quando `e introdotto un numero maggiore di 16.

L’istruzione raise prende due argomenti: il tipo di eccezione e l’indicazione specifica del tipo di errore. ErroreNumero `e un nuovo tipo di eccezione che abbiamo inventato appositamente per questa applicazione.

Se la funzione che chiama InputNumero gestisce gli errori il programma continua, altrimenti Python stampa il messaggio d’errore e termina l’esecuzione:

>>> InputNumero() Dimmi un numero: 17

ErroreNumero: mi aspetto numeri minori di 17!

Il messaggio di errore include l’indicazione del tipo di eccezione e l’informazione aggiuntiva che `e stata fornita.

Esercizio: scrivi una funzione che usa InputNumero per inserire un numero da tastiera e gestisce l’eccezione ErroreNumero quando il numero non `e corretto.

11.6 Glossario

File: entit`a identificata da un nome solitamente memorizzata su hard disk, floppy disk o CD-ROM, e contenente una serie di dati.

114 File ed eccezioni

Directory: contenitore di file; `e anche chiamata cartella o folder.

Percorso: sequenza di nomi di directory che specifica l’esatta locazione di un file.

File di testo: file che contiene solo caratteri stampabili organizzati come serie di righe separate da caratteri di ritorno a capo.

Istruzione break: istruzione che causa l’interruzione immediata del flusso del programma e l’uscita da un ciclo.

Istruzione continue: istruzione che causa l’immediato ritorno del flusso del programma all’inizio del ciclo senza completarne il corpo.

Operatore formato: operatore indicato da ’%’ che produce una stringa di caratteri in base ad una stringa di formato passata come argomento. Stringa di formato: stringa che contiene caratteri stampabili e stabilisce

co-me debbano essere formattati una serie di valori in una stringa.

Sequenza di formato: sequenza di caratteri che inizia con % e che stabili-sce, all’interno di una stringa di formato, come debba essere convertito in stringa un singolo valore.

Pickling: operazione di scrittura su file di un valore assieme alla descrizione del suo tipo, in modo da poterlo recuperare facilmente in seguito. Eccezione: errore in esecuzione.

Gestire un’eccezione: prevedere i possibili errori in esecuzione per fare in modo che questi non interrompano l’esecuzione del programma.

Sollevare un’eccezione: segnalare la presenza di una situazione anomala fa-cendo uso dell’istruzione raise.

Classi e oggetti

12.1 Tipi composti definiti dall’utente

Abbiamo usato alcuni dei tipi composti predefiniti e ora siamo pronti per crearne uno tutto nostro: il tipo Punto.

Considerando il concetto matematico di punto nelle due dimensioni, il punto `e definito da una coppia di numeri (le coordinate). In notazione matematica le coordinate dei punti sono spesso scritte tra parentesi con una virgola posta a separare i due valori. Per esempio (0, 0) rappresenta l’origine e (x, y) il punto che si trova x unit`a a destra e y unit`a in alto rispetto all’origine.

Un modo naturale di rappresentare un punto in Python `e una coppia di numeri in virgola mobile e la questione che ci rimane da definire `e in che modo raggruppare questa coppia di valori in un oggetto composto: un sistema veloce anche se poco elegante sarebbe l’uso di una tupla, anche se possiamo fare di meglio.

Un modo alternativo `e quello di definire un nuovo tipo composto chiamato classe. Questo tipo di approccio richiede un po’ di sforzo iniziale, ma i suoi benefici saranno subito evidenti.

Una definizione di classe ha questa sintassi: class Punto:

pass

Le definizioni di classe possono essere poste in qualsiasi punto di un programma ma solitamente per questioni di leggibilit`a sono poste all’inizio, subito sotto le istruzioni import. Le regole di sintassi per la definizione di una classe sono le stesse degli altri tipi composti: la definizione dell’esempio crea una nuova classe chiamata Punto. L’istruzione pass non ha effetti: `e stata usata per il solo fatto che la definizione prevede un corpo che deve ancora essere scritto.

Creando la classe Punto abbiamo anche creato un nuovo tipo di dato chiamato con lo stesso nome. I membri di questo tipo sono detti istanze del tipo o oggetti. La creazione di una nuova istanza `e detta istanziazione: solo al

116 Classi e oggetti

momento dell’istanziazione parte della memoria `e riservata per depositare il valore dell’oggetto. Per creare un oggetto di tipo Punto viene chiamata una funzione chiamata Punto:

P1 = Punto()

Alla variabile P1 `e assegnato il riferimento ad un nuovo oggetto Punto. Una funzione come Punto, che crea nuovi oggetti e riserva quindi della memoria per depositarne i valori, `e detta costruttore.

Nel documento Pensare da informatico (pagine 131-135)

Documenti correlati