Come gestire le eccezioni in Python

È molto comune riscontrare errori durante l'esecuzione di un programma. Due tipi comuni di errori che potresti dover gestire sono errori di sintassi ed eccezioni. Gli errori di sintassi si verificano quando si digita il codice in modo errato. In questi casi, la riga errata viene ripetuta dal parser con una freccia che punta alla prima posizione in cui è stato rilevato l'errore.

Le eccezioni sono diverse dagli errori di sintassi. Si verificano durante l'esecuzione di un programma quando accade qualcosa di inaspettato. Ad esempio, supponiamo che tu stia chiedendo all'utente di inserire un numero per eseguire una divisione. Ora, se l'utente inserisce una stringa invece di un numero e si prova a dividere un numero con l'input specificato, il programma genererà un TypeError

Quando non gestisci correttamente le eccezioni, il programma si interrompe bruscamente perché non saprà cosa fare in questi casi. Il seguente codice è un esempio:

keep_asking = True while keep_asking: x = int (input ("Inserisci un numero:")) print ("Dividere 50 per", x, "ti darà:", 50 / x)

Finché si immette un valore di input integrale, il programma funzionerà correttamente. Tuttavia, non appena inserisci una stringa o anche un numero decimale come input, otterrai un ValueError eccezione.

In questo tutorial, imparerai come gestire e sollevare correttamente le eccezioni in Python.

Alcune eccezioni comuni

Ecco alcune eccezioni di base che potresti incontrare durante la scrittura dei programmi. Puoi leggere molte altre eccezioni built-in sul sito ufficiale.

  • NameError: Questa eccezione viene sollevata quando il programma non riesce a trovare un nome locale o globale. Il nome che non è stato possibile trovare è incluso nel messaggio di errore.
  • TypeError: Questa eccezione viene sollevata quando una funzione passa un oggetto del tipo inappropriato come argomento. Ulteriori dettagli sul tipo sbagliato sono forniti nel messaggio di errore.
  • ValueError: Questa eccezione si verifica quando un argomento di funzione ha il tipo giusto ma un valore inappropriato. 
  • NotImplementedError: Questa eccezione viene sollevata quando si suppone che un oggetto supporti un'operazione, ma non è ancora stato implementato. Non si dovrebbe usare questo errore quando la funzione data non intende supportare il tipo di argomento di input. In quelle situazioni, crescendo a TypeError l'eccezione è più appropriata.
  • ZeroDivisionError: Questa eccezione viene sollevata quando si fornisce il secondo argomento per un'operazione di divisione o modulo come zero.
  • FileNotFoundError: Questa eccezione viene sollevata quando il file o la directory che il programma richiesto non esiste.

Proprio come i nomi sopra, la maggior parte delle eccezioni hanno nomi che si spiegano da soli.

Gestire un'eccezione

Il codice all'inizio dell'articolo chiedeva agli utenti di inserire un numero intero come input. Se l'utente non ha fornito un input intero, il programma ha interrotto l'esecuzione e generato un'eccezione di errore di valore. In questa sezione, scriveremo del codice per dire all'utente che il loro input non è un valore intero valido.

Il primo passo del processo è includere il codice che pensi possa sollevare un'eccezione all'interno del provare clausola. Il prossimo passo è usare il tranne parola chiave per gestire l'eccezione che si è verificata nel codice precedente. Il codice modificato per l'input dell'utente sarà simile a questo:

keep_asking = True while keep_asking: try: x = int (input ("Please enter a number:")) print ("Dividere 50 per", x, "ti darà:", 50 / x) ad eccezione di ValueError: print (" L'input non era un numero intero. Riprova ... ")

Quello che succede qui è che il programma tenta di eseguire il codice all'interno del provare clausola. Se non è stata sollevata alcuna eccezione, il programma salta il file tranne la clausola e il resto del codice vengono eseguiti normalmente. Se viene sollevata un'eccezione, il programma salta il codice rimanente all'interno di provare clausola e il tipo dell'eccezione è abbinata al nome dell'eccezione dopo il tranne parola chiave. In caso di corrispondenza, il codice all'interno del tranne la clausola viene eseguita per prima, e quindi il resto del codice dopo il provare la clausola viene eseguita normalmente.

Quando inserisci un intero come input, il programma ti dà il risultato finale della divisione. Quando viene fornito un valore non integrale, il programma stampa un messaggio che chiede di provare a inserire di nuovo un numero intero. Notare che questa volta, il programma non si chiude improvvisamente quando si fornisce alcun input non valido.

Puoi avere multipli tranne clausole per gestire diverse eccezioni. Tieni presente che questi gestori gestiranno solo eccezioni che si sono verificate nel corrispondente provare clausola. Non gestiranno eventuali eccezioni sollevate all'interno di altri gestori di eccezioni.

Puoi anche gestire più eccezioni usando un singolo tranne clausola passando queste eccezioni alla clausola come a tuple.

tranne (ZeroDivisionError, ValueError, TypeError): print ("Qualcosa è andato storto ...") # codice per gestire l'eccezione

Infine, puoi anche omettere il nome dell'eccezione dopo il tranne parola chiave. Questo in genere non è raccomandato in quanto il codice ora catturerà tutte le eccezioni e le gestirà allo stesso modo. Questo non è ottimale in quanto gestirai un TypeError eccezione allo stesso modo in cui avresti gestito a ZeroDivisionError eccezione. Quando gestisci le eccezioni, è meglio essere il più specifici possibile e prendere solo ciò che puoi gestire.

Un possibile uso di catturare tutte le eccezioni è di stampare correttamente l'errore di eccezione sullo schermo come il seguente codice:

import math import sys try: result = math.factorial (2.4) eccetto: print ("Qualcosa Inaspettato è successo.", sys.exc_info () [0]) else: print ("Il fattoriale è", risultato)

Utilizzando la clausola Else

Puoi anche usare un altro clausola in a provare ... tranne dichiarazione. Il altro la clausola è intesa per contenere il codice che deve essere eseguito se il provare la clausola non ha sollevato eccezioni. Questo può essere utile per assicurarti di non aggiungere alcun codice al file provare blocco le cui eccezioni non intendi cogliere. Una cosa degna di nota è che se si decide di utilizzare un altro clausola, dovresti includerla dopo tutto il tranne clausole ma prima del finalmente bloccare.

Nel nostro caso, potremmo spostare la linea che stampa il risultato della nostra divisione all'interno di altro bloccare.

keep_asking = True while keep_asking: try: x = int (input ("Immettere un numero:")) ad eccezione di ValueError: print ("L'input non era un numero valido. Riprovare ...") else: print ("Dividing 50 per ", x," ti darà: ", 50 / x)

Pulire usando la clausola finale

Diciamo che hai scritto del codice all'interno del provare blocco che dovrebbe svolgere un'attività utilizzando una grande quantità di risorse. È importante rilasciare quelle risorse quando hai finito di usarle. Questo può essere facilmente ottenuto usando il finalmente clausola. 

Il codice all'interno del finalmente la clausola viene sempre eseguita indipendentemente dal fatto che provare il blocco ha sollevato un'eccezione. Puoi verificarlo eseguendo il seguente codice:

keep_asking = True while keep_asking: try: x = int (input ("Immettere un numero:")) ad eccezione di ValueError: print ("L'input non era un numero valido. Riprovare ...") else: print ("Dividing 50 con ", x," ti darà: ", 50 / x) finalmente: print (" Ha già fatto tutto il necessario. ")

Se qualcuno dei tranne le clausole che hai specificato non gestiscono l'eccezione sollevata, la stessa eccezione viene sollevata di nuovo dopo l'esecuzione del codice all'interno di finalmente bloccare.

Un esempio più complesso

In questa sezione, scriveremo un programma per gestire più eccezioni. Proprio come gli esempi precedenti, eseguiremo alcune operazioni matematiche. Tuttavia, questa volta prenderemo l'input da una lista.

Il seguente codice controlla due eccezioni, TypeError e ValueError. Il altro il blocco è usato per stampare il fattoriale. È possibile vedere nell'output che questo codice viene eseguito solo quando non viene sollevata alcuna eccezione.

import math number_list = [10, -5,1.2, 'apple'] per il numero in number_list: try: number_factorial = math.factorial (numero) tranne TypeError: print ("Factorial non è supportato per un dato tipo di input.") tranne ValueError : print ("Fattoriale accetta solo valori interi positivi", numero "non è un numero intero positivo") else: print ("Il fattoriale di", numero, "è", numero_fattoriale) infine: print ("Rilascia qualsiasi risorsa in uso.")

Il codice sopra riportato produce il seguente output:

Il fattoriale di 10 è 3628800 Rilascio di risorse in uso. Factorial accetta solo valori interi positivi. -5 non è un numero intero positivo. Rilascio di risorse in uso. Factorial accetta solo valori interi positivi. 1.2 non è un numero intero positivo. Rilascio di risorse in uso. Fattoriale non è supportato per un determinato tipo di input. Rilascio di risorse in uso.

Un'altra cosa che vale la pena di notare è che il codice all'interno del finalmente la clausola viene eseguita per ciascun elemento nell'elenco.

Pensieri finali

Spero che questo tutorial ti abbia aiutato a capire la gestione delle eccezioni in Python. Inoltre, non esitare a vedere ciò che abbiamo a disposizione per la vendita e per studiare nel mercato, e non esitare a fare domande e fornire il tuo prezioso feedback utilizzando il feed qui sotto.

Gestire correttamente le eccezioni può essere molto utile in situazioni in cui l'uscita da un programma dopo aver ricevuto un input inaspettato non è fattibile. Se avete domande relative alla gestione delle eccezioni in Python, fatemelo sapere nei commenti. 

Impara Python

Impara Python con la nostra guida completa al tutorial su Python, sia che tu stia appena iniziando o che sei un programmatore esperto che cerca di imparare nuove abilità.