Gestione delle eccezioni di Python Utilizzando l'istruzione try, tranne e infine

In questo tutorial imparerai come gestire le eccezioni nel tuo programma Python usando le istruzioni try, tranne e infine con l'aiuto di esempi.

Video: gestione delle eccezioni Python (prova … tranne … finalmente)

Eccezioni in Python

Python ha molte eccezioni incorporate che vengono sollevate quando il tuo programma incontra un errore (qualcosa nel programma va storto).

Quando si verificano queste eccezioni, l'interprete Python interrompe il processo corrente e lo passa al processo chiamante finché non viene gestito. Se non viene gestito, il programma andrà in crash.

Ad esempio, consideriamo un programma in cui abbiamo una funzione Ache chiama funzione B, che a sua volta chiama funzione C. Se si verifica un'eccezione nella funzione Cma non viene gestita C, l'eccezione passa a Be quindi a A.

Se non viene mai gestito, viene visualizzato un messaggio di errore e il nostro programma si arresta improvvisamente e inaspettato.

Catturare le eccezioni in Python

In Python, le eccezioni possono essere gestite utilizzando tryun'istruzione.

L'operazione critica che può sollevare un'eccezione è posta all'interno della tryclausola. Il codice che gestisce le eccezioni è scritto nella exceptclausola.

Possiamo quindi scegliere quali operazioni eseguire una volta rilevata l'eccezione. Qui c'è un semplice esempio.

 # import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)

Produzione

La voce è un Oops! si è verificato. Voce successiva. La voce è 0 Oops! si è verificato. Voce successiva. La voce è 2 Il reciproco di 2 è 0,5

In questo programma, scorriamo i valori dell'elenco randomList. Come accennato in precedenza, la porzione che può causare un'eccezione viene posta all'interno del tryblocco.

Se non si verifica alcuna eccezione, il exceptblocco viene saltato e il flusso normale continua (per l'ultimo valore). Ma se si verifica un'eccezione, viene rilevata dal exceptblocco (primo e secondo valore).

Qui, stampiamo il nome dell'eccezione utilizzando la exc_info()funzione all'interno del sysmodulo. Possiamo vedere che acause ValueErrore 0cause ZeroDivisionError.

Poiché ogni eccezione in Python eredita dalla Exceptionclasse base , possiamo anche eseguire l'attività di cui sopra nel modo seguente:

 # import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)

Questo programma ha lo stesso output del programma precedente.

Catturare eccezioni specifiche in Python

Nell'esempio precedente, non abbiamo menzionato alcuna eccezione specifica nella exceptclausola.

Questa non è una buona pratica di programmazione in quanto catturerà tutte le eccezioni e gestirà ogni caso allo stesso modo. Possiamo specificare quali eccezioni exceptdovrebbe intercettare una clausola.

Una tryclausola può avere un numero qualsiasi di exceptclausole per gestire diverse eccezioni, tuttavia, solo una verrà eseguita nel caso si verifichi un'eccezione.

Possiamo usare una tupla di valori per specificare più eccezioni in una clausola tranne. Ecco uno pseudo codice di esempio.

 try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass

Sollevare eccezioni in Python

Nella programmazione Python, vengono sollevate eccezioni quando si verificano errori in fase di esecuzione. Possiamo anche sollevare manualmente le eccezioni utilizzando la raiseparola chiave.

Facoltativamente, possiamo passare valori all'eccezione per chiarire il motivo per cui tale eccezione è stata sollevata.

 >>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!

Python prova con la clausola else

In alcune situazioni, potresti voler eseguire un determinato blocco di codice se il blocco di codice all'interno è stato tryeseguito senza errori. In questi casi, è possibile utilizzare la elseparola chiave opzionale con l' tryistruzione.

Nota : le eccezioni nella clausola else non vengono gestite dalle precedenti clausole tranne.

Diamo un'occhiata a un esempio:

 # program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)

Produzione

Se passiamo un numero dispari:

 Immettere un numero: 1 Non un numero pari!

Se passiamo un numero pari, il reciproco viene calcolato e visualizzato.

 Immettere un numero: 4 0,25

Tuttavia, se passiamo 0, otteniamo ZeroDivisionErrorcome il blocco di codice all'interno elsenon viene gestito dal precedente except.

 Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero

Python try… finally

The try statement in Python can have an optional finally clause. This clause is executed no matter what, and is generally used to release external resources.

For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).

In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally clause to guarantee the execution.

Here is an example of file operations to illustrate this.

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

Questo tipo di costrutto assicura che il file venga chiuso anche se si verifica un'eccezione durante l'esecuzione del programma.

Articoli interessanti...