L'istruzione try specifica i gestori delle eccezioni e/o le azioni di pulizia del codice per un gruppo di istruzioni:
try_stmt |
::= | try_exc_stmt | try_fin_stmt |
try_exc_stmt |
::= | "try" ":" suite |
("except" [expression
["," target]] ":" suite)+ | ||
["else" ":" suite] | ||
try_fin_stmt |
::= | "try" ":" suite
"finally" ":" suite |
Ci sono due forme di istruzioni try: try...except e try...finally. Queste forme non possono essere mischiate (ma possono essere annidate in ogni altra).
La forma try...except specifica uno o più gestori di eccezioni (la clausola except). Quando non avvengono eccezioni nella clausola try, non viene eseguito nessun gestore di eccezioni. Quando viene sollevata un'eccezione nella suite try, viene avviata la ricerca per un gestore di eccezioni. Questa ricerca ispeziona le clausole except una ad una finché non ne viene trovata una che verifica l'eccezione. Una clausola per un'eccezione expression-less, se presente, deve essere l'ultima; questa verifica ogni eccezione. Per una clausola except con un'espressione, viene cercata quell'espressione e la clausola cerca l'eccezione se il risultante oggetto è ``compatibile'' con l'eccezione. Un oggetto è compatibile con un'eccezione se quest'ultima è anche l'oggetto che identifica l'eccezione, o (per eccezioni che sono anche classi) si intende una classe base di una eccezione, o è una tupla contenente un elemento che è compatibile con l'eccezione. Notare che l'identità dell'oggetto deve corrispondere, per esempio deve essere lo stesso oggetto, non solamente un oggetto con lo stesso valore.
Se nessuna clausola except corrisponde all'eccezione, la ricerca per un gestore di eccezione continua nel codice vicino e sulla pila invocata.
Se la valutazione di un'espressione nell'intestazione di una clausola except solleva un'eccezione, la ricerca originale per un gestore viene cancellata e parte una ricerca per una nuova eccezione nel codice vicino e sulla pila chiamata (quest'ultima viene trattata come se l'intera istruzione try sollevasse un'eccezione).
Quando una clausola except di ricerca viene trovata, i parametri dell'eccezione vengono assegnati alla destinazione specificata in quella clausola except, se presente, e le clausole except della suite vengono eseguite. Tutte le clusole except devono avere un blocco eseguibile. Quando la fine di questo blocco viene raggiunta, l'esecuzione continua normalmente dopo l'intera istruzione try. (Questo significa che se due gestori annidati esistono per la stessa eccezione e l'eccezione ha luogo nella clausola try del gestore nascosto, il gestore esterno non riuscirà a gestire l'eccezione.)
Prima che una clausola except della suite venga eseguita, i dettagli
dell'eccezione vengono assegnati alle tre variabili del modulo
sys: sys.exc_type
riceve l'oggetto
che identifica l'eccezione; sys.exc_value
riceve i parametri
dell'eccezione; sys.exc_traceback
riceve un oggetto traceback
(vedere la sezione 3.2) identificando nel programma il
punto dove è stata sollevata l'eccezione. Questi dettagli sono anche
disponibili attraverso la funzione sys.exc_info(), che
restituisce una tupla
(exc_type, exc_value, exc_traceback)
.
L'uso delle variabili corrispondenti è deprecato in favore di questa
funzione, da quando il loro uso è insicuro in un programma che fa uso
dei thread. Come per Python 1.5, le variabili vengono riportate al
loro precedente valore (prima della chiamata) quando ritornano da una
funzione che ha gestito un'eccezione.
La clausola facoltativa else viene eseguita se e quando il controllo di flusso va oltre la fine della clausola try.7.1 Le eccezioni della clausola else non vengono gestite dalle precedenti clausole except.
La forma try...finally specifica un gestore di pulizia. La clausola try viene eseguita. Quando non vengono sollevate eccezioni, la clausola finally viene eseguita. Quando viene sollevata un'eccezione nella clausola try, l'eccezione viene temporaneamente salvata, la clausola finally viene eseguita e quindi l'eccezione salvata viene sollevata di nuovo. Se la clausola finally solleva un'altra eccezione o esegue un'istruzione return o break, l'eccezione salvata è persa. Un'istruzione continue è illegale in una clausola finally. (La ragione è un problema con la corrente implementazione -- in futuro questa restrizione potrebbe essere rimossa). L'informazione sull'eccezione non è disponibile al programma durante l'esecuzione della clausola finally.
Quando un'istruzione return, break o continue viene eseguita nella suite try di un'istruzione try...finally, viene eseguita anche la clausola finally. (La ragione è un problema con la corrente implementazione -- in futuro questa restrizione potrebbe essere rimossa).
Ulteriori informazioni sulle eccezioni possono essere trovate nella sezione 4.2 e informazioni sull'uso dell'istruzione raise per generare eccezioni possono essere trovate nella sezione 6.9.