Riferimenti: SoftPython - funzioni 2
Esc
Summer School Data Science 2023 - Modulo 1 informatica: Moodle
Docente: David Leoni david.leoni@unitn.it
Esercitatore: Luca Bosotti luca.bosotti@studenti.unitn.it
Come fermare l'esecuzione di tutto il programma appena riscontriamo una situazione imprevista?
Riferimenti:
Per interrompere l'esecuzione del programma in un punto, si può inserire l'istruzione raise
così:
raise Exception()
Volendo, si può anche scrivere una indicazione per i programmatori:
raise Exception("Non c'è abbastanza farina !")
print("PRIMA")
raise Exception("Non c'è abbastanza farina !")
print("DOPO")
PRIMA
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
/tmp/ipykernel_10578/2095967716.py in <module>
1 print("Prima")
----> 2 raise Exception("Non c'è abbastanza farina !")
3 print("Dopo")
Exception: Non c'è abbastanza farina !
def fai_torta_eccezionale(latte, farina):
""" Prende ingredienti float
e STAMPA il procedimento
- servono almeno 1.3 kg per il latte
e 1.0kg per la farina
- se mancano ingredienti, lancia Exception
"""
if latte < 1.3:
raise Exception("Non ho abbastanza latte !")
if farina < 1.0:
raise Exception("Non ho abbastanza farina !")
print("Impasto")
print("Scaldo")
print("Ho fatto la torta !")
fai_torta_eccezionale(5,0.2)
print("Festeggia")
Se c'è una sezione di codice problematica 'che può scoppiare'...
la si può mettere in un blocco try
except
così:
try:
fai_torta_eccezionale(5.0,0.2)
print("Festeggia")
except:
print("Non riesco a fare la torta, che ne dite se usciamo a prendere del gelato?")
print("Fine della festa")
Non riesco a fare la torta, che ne dite se usciamo a prendere del gelato? Fine della festa
Immagine da: Mike Lam, CS 240 Data Structures and Algorithms - Fall 2014 https://w3.cs.jmu.edu/spragunr/CS240_F14/activities/exceptions/exceptions.shtml
Torta particolare 1/2¶
possiamo usarla per segnalare meglio il tipo di errore che è accaduto, così chi chiama la funzione può intercettare solo quella tipologia di errore |
def fai_torta_particolare(latte, farina):
""" Prende ingredienti come float
e STAMPA il procedimento
- servono almeno 1.3 kg per il latte
e 1.0kg per la farina
- se mancano ingredienti, lancia ValueError
"""
if latte < 1.3:
raise ValueError("Non ho abbastanza latte !")
if farina < 1.0:
raise ValueError("Non ho abbastanza farina !")
print("Impasto")
print("Scaldo")
print("Ho fatto la torta !")
try:
fai_torta_particolare(5,0.2)
print("Festeggia")
except ValueError:
print("Mancano ingredienti!")
print("Proviamo a chiedere ai vicini!")
print("Ci hanno dato ingredienti, riproviamo !")
fai_torta_particolare(6,4)
print("Festeggia")
print("Fine programma")
|
Torta particolare 2/2¶Se aggiungiamo la cattura di Guarda la chiamata di funzione. Noti qualcosa di strano? |
def fai_torta_particolare(latte, farina):
""" Prende ingredienti float
e STAMPA il procedimento
- servono almeno 1.3 kg per il latte
e 1.0kg per la farina
- se mancano ingredienti, lancia ValueError
"""
if latte < 1.3:
raise ValueError("Non ho abbastanza latte !")
if farina < 1.0:
raise ValueError("Non ho abbastanza farina !")
print("Impasto")
print("Scaldo")
print("Ho fatto la torta !")
try:
fai_torta_particolare("rape","cavoli") # ???
print("Festeggia")
except ValueError:
print("Mancano ingredienti!")
print("Proviamo a chiedere ai vicini!")
print("Ci hanno dato ingredienti, riproviamo !")
fai_torta_particolare(6,4)
print("Festeggia")
# gestisce tutte le altre eccezioni
except Exception as eccezione:
print("Ragazzi, è successo un problema grave:",
repr(eccezione))
print("Fine programma")
|
Per testare il codice, si può usare il comando assert
assert
CONDIZIONE
verifica che CONDIZIONE sia vera
assert True
¶print("PRIMA")
assert True
print("DOPO")
PRIMA DOPO
non fa assolutamente niente!
assert False
¶print("PRIMA")
assert False
print("DOPO")
PRIMA
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-7-a871fdc9ebee> in <module>()
----> 1 assert False
AssertionError:
AssertionError
"dopo"
non venga stampatoassert
¶Se a un certo punto del programma:
farina
posso scrivere così:
assert farina > 1.0
Pensati principalmente per debuggare, verificare condizioni 'al volo'
bello ma... e la performance?
assert
disabilitabile con -O
python -O mio_file.py
assert
vs raise Exception()
¶se volete solo debuggare (e magari disabilitare in seguito):
assert farina >= 1.0
per controlli che volete fare sempre:
if not farina >= 1.0:
raise Exception("Manca la farina")
def somma(x, y):
""" Prende due numeri e RITORNA la loro somma
"""
s = x + 3
return s
print(somma(5,3))
print(somma(3,5))
print(somma(1,2))
8 6 4
def somma(x, y):
""" Prende due numeri e RITORNA la loro somma
"""
s = x + 3
return s
print(somma(5,3), 'mi attendo 8')
print(somma(3,5), 'mi attendo 8')
print(somma(1,2), 'mi attendo 3')
8 mi attendo 8 6 mi attendo 8 4 mi attendo 3
def somma(x, y):
""" Prende due numeri e RITORNA la loro somma
"""
s = x + 3
return s
assert somma(5,3) == 8
assert somma(3,5) == 8
assert somma(1,2) == 3
print("Congratulazioni! Hai passato tutti i test!")
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
/tmp/ipykernel_6319/3657306284.py in <module>
7
8 assert somma(5,3) == 8
----> 9 assert somma(3,5) == 8
10 assert somma(1,2) == 3
11 print("Congratulazioni! Hai passato tutti i test!")
AssertionError:
Nota 2: noi mettiamo i test nello stesso file che stiamo testando, ma di solito vengono messi in un file separato apposito