È 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.
Ecco alcune eccezioni di base che potresti incontrare durante la scrittura dei programmi. Puoi leggere molte altre eccezioni built-in sul sito ufficiale.
TypeError
l'eccezione è più appropriata.Proprio come i nomi sopra, la maggior parte delle eccezioni hanno nomi che si spiegano da soli.
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)
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)
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.
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.
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 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à.