Site icon Tosolini.info

Python: Try/except (finally else)

Nell’articolo precedente ho spiegato come funziona in Python la gestione di una (o più) eccezione attraverso try ed except. Questa funzione però ha la possibilità di essere ulteriormente espanso attraverso altri due parole chiave che sono “finally” ed “else“.

Finally è piuttosto semplice da spiegare, esso di fatto viene eseguito a prescindere, cioè sia che la parte di codice compresa in try ritorni un valore vero o falso (quindi che trovi o non trovi una eccezione) finally verrà eseguito comunque subito dopo. Qui però va fatta una precisazione. Nel caso ci sia una eccezione, quindi eseguito il codice di except, la parte espressa in finally continuerà senza errori se l’eccezione negli except è gestita. Viceversa se l’eccezione non è gestita, il codice eseguirà la parte compresa in finally e successivamente mostrerà il codice di errore andando in blocco.

Facciamo un esempio pratico, se eseguiamo questo codice:

def divisione(x, y):
    return x // y

try:
    i = divisione(5, 0)
except ValueError:
    print("Errore, non posso dividere per zero")
finally:
    print("eseguo finally")

Il risultato sarà che viene stampato “eseguo finally” e successivamente tutta la pila di errore dello stack di Python che al termine riporta il ZeroDivisionError. Questo perché di fatto l’eccezione relativa a ZeroDivisionError non è stata gestita, ma abbiamo indicato solo ValueError.

Questa precisazione è doverosa perché si può essere portati a credere erroneamente che Finally riesca a gestire comunque le eccezioni, quando in realtà non è così. Questo comando torna utile quando sappiamo che una parte di codice dovrà essere comunque processata a prescindere, e questo ci torna utile sia in fase di debug che in fase di produzione.

L’altro comando è “else” e in modo simile ai comandi condizionali, questo potrà essere inserito solo al termine di tutti gli except e prima di finally. In sostanza il suo codice viene eseguito solo dopo try e solo se questo non ha riportato eccezioni, quindi non sono stati eseguiti i blocchi di codice in except. Ma comunque viene eseguito di prima di finally, chiaramente se la parte condizionale è soddisfatta. Un esempio utilizzando la falsa riga di quelli precedenti può essere:

def divisione(x, y):
    return x // y

try:
    i = divisione(5, 2)
except ZeroDivisionError:
    print("Errore, non posso dividere per zero")
else:
    print(i)
finally:
    print("finally")

In questo caso la variabile “i” viene mostrata perché l’eccezione non è stata rilevata e quindi il blocco “else” può mostrare il risultato.

Questi comandi sono funzionali a try/except e sono facoltativi, tuttavia possono coprire quelle aree di ulteriore complessità che una potenziale eccezione può portarsi dietro.

In un ulteriore articolo andrò a descrivere la funzione “raise” e “assert” che in realtà possono anche essere utilizzate in modo combinato su try/execpt, ma possono anche essere utilizzate fuori da questo contesto.

Exit mobile version