Subsections

16. Occuparsi dell'imperfetto (o come gestire gli errori)

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.

16.1 Esercizi

Aggiornate il programma della rubrica telefonica del capitolo precedente in modo che non si interrompa se l'utente non inserisce dati nel menu.