Site icon Tosolini.info

Python: try, except spiegato

Una delle particolarità di Python è il “try except“. Sicuramente se sei qui conoscerai le funzioni condizionali, ovvero IF ELSE che ovviamente dispone anche questo linguaggio di programmazione.

Però può capitare, per varie ragioni, che proprio a seguito di una condizione o di un classico ciclo FOR, i dati che andremo ad elaborare non siano del tutto sicuri. Ovvero ci potremo trovare davanti a quella che viene chiamata eccezione (exception) e che deve essere gestita poiché il programma si bloccherebbe in modo anomalo (il classico crash).

In genere la gestione delle eccezioni va costruita secondo i casi, Pyhton però è dotata appunto di try except che ci permette di trattare come oggetti anche queste situazioni.

Try ed except vanno concepiti come due oggetti distinti, ovvero con try dichiariamo qualcosa che vogliamo eseguire, ad esempio l’esecuzione di una funzione, se questa funziona passa avanti, ma nel caso dia errore anziché “scalare” i vari oggetti che è il comportamento base di Python, passa subito ad except che è appunto il blocco dove metteremo il codice per gestire la situazione anomala. Vediamo un esempio pratico.

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

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

Come si vede abbiamo definito una funzione che effettua una divisione. Poi abbiamo assegnato ad una variabile “i” proprio la funzione passandogli i valori 5 a x e zero a y. Siccome non è possibile dividere per zero, e Python darebbe errore di tipo ZeroDivisionError, il codice passerà direttamente ad except mostrando il messaggio contenuto nella print, anziché mostrare tutto lo stack di errore del Python medesimo, che a seconda del programma e dei moduli utilizzati può essere lungo e complicato da esaminare.

Il codice sopra è chiaramente banale, ma mi permette in questo caso di conoscere già a priori quale sarebbe il tipo di eccezione a cui potenzialmente vado incontro, e pertanto except può essere ristretto nel suo campo di funzionamento, proprio dichiarando il tipo di eccezione, in questo caso una ZeroDivisionError:

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

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

Questo esempio mi permette di puntualizzare che except può essere dichiarato più volte:

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

try:
    i = divisione(5, Z)
except ZeroDivisionError:
    print("Errore, non posso dividere per zero")
except:
    print("Errore, posso utilizzare solo numeri")

In questo caso passo alla variabile “i” un dato scorretto, cioè una lettera anziché un numero, e chiaramente la prima except viene saltata. Tuttavia avrei potuto scrivere il tutto tenendo comunque una sola except utilizzando questa forma:

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

try:
    i = divisione(5, Z)
except (ZeroDivisionError, NameError):
    print("Errore, dato immesso non corretto")

che però può essere meno intuitiva della precedente. In ogni caso sappiate che si possono raggruppare le tipologie di eccezioni.

Except può anche essere ulteriormente “espanso” attraverso “as” che ci permette di incapsulare il suo contenuto in una variabile per poterla successivamente trattare.

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

try:
    i = divisione(5, 0)
except ZeroDivisionError as e:
    print(e.args)

Come si nota, la print ci mostrerà la variabile “e” con la parola riservata args il suo contenuto con i dettagli dell’errore che except ha rilevato, in questo caso “(‘integer division or modulo by zero’,)“.

Ricapitolando, sicuramente deve essere presente una try, mentre possono essere presenti un numero virtualmente infinito di except. Questa coppia non è l’unica, infatti sono presenti anche i comandi “finally” ed “else”, oltre a “raise” che tratterò in articoli separati.

Exit mobile version