English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di base di Python

Controllo dei flussi in Python

Funzione in Python

Tipi di dati in Python

Operazioni sui file in Python

Oggetti e classi in Python

Data e ora in Python

Conoscenze avanzate di Python

Manuale di riferimento di Python

Gestione delle eccezioni in Python - Try, Except e finally

In questo articolo, imparerai come utilizzare le frasi try, except e finally per gestire le eccezioni nei programmi Python. Questo ti ispirerà a scrivere codice pulito, leggibile ed efficiente in Python.

Cos'è un'eccezione in Python?

Python ha molteEccezioni integrate  Quando alcuni errori si verificano, costringono il tuo programma a produrre errori.

Quando si verificano queste eccezioni, causano la sospensione del processo corrente e la trasmissione al processo chiamante fino a quando non vengono gestite. Se non vengono gestite, il nostro programma si bloccerà.

Ad esempio, se la funzione A chiama la funzione B, che a sua volta chiama la funzione C e si verifica un'eccezione nella funzione C. Se l'eccezione non viene gestita in C, l'eccezione verrà passata a B e poi a A.

Se non vengono gestite, verrà lanciato un messaggio di errore e il nostro programma si fermerà improvvisamente.

In Python, catturare le eccezioni

In Python, è possibile gestire le eccezioni utilizzando la frase try.

Le operazioni che possono causare eccezioni vengono messe nel blocco try e il codice per gestire le eccezioni viene scritto nel blocco except.

Dopo aver catturato l'eccezione, cosa faremo dipende da noi. Questo è un esempio semplice.

# Importare il modulo sys per ottenere il tipo di eccezione
import sys
randomList = ['a', 0, 2]
for entry in randomList:
    try:
        print("L'ingresso è", entry)
        r = 1/int(entry)
        break
    except:
        print("Oops!", sys.exc_info()[0], "è occorso.")
        print("Prossimo ingresso.")
        print()
print("Il reciproco di", entry, "è", r)

Risultato di output

L'ingresso è a
Oops! <class 'ValueError'> è occorso.
Prossimo ingresso.
L'ingresso è 0
Oops! <class 'ZeroDivisionError'> è occorso.
Prossimo ingresso.
L'ingresso è 2
Il reciproco di 2 è 0.5

In questo programma, eseguiamo un ciclo fino a quando l'utente inserisce un intero con un inverso valido. La parte che potrebbe causare un'eccezione viene messa nel blocco try.

Se non si verifica alcuna eccezione, il contenuto del blocco except viene saltato e si continua con il flusso di lavoro normale. Tuttavia, se si verifica qualsiasi eccezione, viene catturata dal blocco except.

Qui, usiamo la funzione exinfo() del modulo sys per stampare il nome dell'eccezione e chiedere all'utente di riprovare. Possiamo vedere che i valori 'a' e '1.3' causano ValueError, mentre '0' causa ZeroDivisionError.

Catturare eccezioni specifiche in Python

Nell'esempio sopra, non abbiamo menzionato alcuna eccezione nell'except clause.

Non è un'abitudine di programmazione buona, perché cattura tutte le eccezioni e le gestisce in modo identico in ogni caso. Possiamo specificare quali eccezioni catturare con le clause except.

Un blocco try può avere un numero qualsiasi di clause except per gestirle in modo diverso, ma solo una clause except viene eseguita quando si verifica un'eccezione.

Possiamo usare un tuple di valori per specificare più eccezioni nell'except clause. Ecco un esempio di pseudocodice.

try:
   # Eseguire alcuni codici
   pass
except ValueError:
   # Gestione dell'eccezione ValueError
   pass
except (TypeError, ZeroDivisionError):
   # Gestione di più eccezioni
   # Errore di tipo TypeError e ZeroDivisionError
   pass
except:
   # Gestisci tutte le altre eccezioni
   pass

Sollevare un'eccezione

In programmazione Python, le eccezioni vengono sollevate quando si verificano errori durante l'esecuzione, ma possiamo utilizzare la parola chiave raise per sollevare manualmente un'eccezione.

Possiamo anche passare un valore all'eccezione per chiarire il motivo per cui è stata sollevata.

>>> raise KeyboardInterrupt
Traceback (chiamata più recente in basso):
...
KeyboardInterrupt
>>> raise MemoryError("Questo è un argomento")
Traceback (chiamata più recente in basso):
...
MemoryError: Questo è un argomento
>>> try:
... a = int(input("Inserisci un numero intero positivo: "))
... if a <= 0:
... raise ValueError("Questo non è un numero positivo!")
... except ValueError as ve:
... print(ve)
...    
Inserisci un numero intero positivo: -2
Questo non è un numero positivo!

try...finally

Le istruzioni try di Python possono avere una clausola finally opzionale. Questa clausola viene eseguita in qualsiasi situazione e di solito viene utilizzata per liberare risorse esterne.

Ad esempio, possiamo connetterci a un data center remoto tramite una connessione di rete, o utilizzare file o grafica utente (GUI).

In tutti questi casi, dobbiamo sempre liberare le risorse, indipendentemente dal fatto che siano state utilizzate con successo. Queste operazioni (chiudere i file, GUI o disconnettersi dalla rete) vengono eseguite nella clausola finally per garantire che vengano eseguite.

Questo è unOperazioni di fileper illustrare questo punto.

try:
   f = open("test.txt", encoding = 'utf-8')
   # Esegui operazioni di file
finally:
   f.close()

Questo tipo di costruzione garantisce che i file vengano chiusi anche in caso di eccezione.