Ora avete un programma perfetto, funziona senza crepe, ad eccezione di
un dettaglio: va in crash se l'utente inserisce un input errato. Non
abbiate paura, Python ha una speciale struttura di controllo per
eliminare questi imprevisti. Sto parlando di try
... try tenta di
fare qualcosa. Segue un esempio di un programma che contiene un
problema:
print "Type Control C or -1 to exit" number = 1 while number != -1: number = int(raw_input("Enter a number: ")) print "You entered: ",number
Se tentate di inserire qualcosa come @#&
l'output sarà simile a
questo:
Traceback (innermost last): File "try_less.py", line 4, in ? number = int(raw_input("Enter a number: ")) ValueError: invalid literal for int(): @#&
Come potete vedere la funzione int
non funziona (e non deve
funzionare) con il numero @#&
. L'ultima linea mostra qual'è
l'errore: Python ha trovato un ValueError
. Come fare in modo
che il nostro programma sappia gestire anche questo valore?
Innanzitutto inserendo la parte di codice che restituisce l'errore in
un blocco try
e poi decidendo come Python debba trattare
ValueError
. Il seguente programma mostra come ottenere tale
comportamento:
print "Type Control C or -1 to exit" number = 1 while number != -1: try: number = int(raw_input("Enter a number: ")) print "You entered: ",number except ValueError: print "That was not a number."
Ora, quando eseguiremo il nuovo programma ed inseriremo @#&
, il
programma risponderà con la frase ``That was not a number.'' per poi
continuare ciò che stava facendo prima.
Quando il vostro programma restituisce un errore che sapete come
gestire, mettete il codice in un blocco try
ed il modo per
gestire l'errore nel successivo blocco except
.
Aggiornate il programma della rubrica telefonica del capitolo precedente in modo che non si interrompa se l'utente non inserisce dati nel menu.