6.1 Lancio intenzionale delle eccezioni
In Python puoi lanciare intenzionalmente eccezioni utilizzando l'operatore raise. Questo ti permette di segnalare l'occorrenza di un errore o una situazione problematica nel tuo programma. Diamo un'occhiata ai diversi modi di usare l'operatore raise e re-incapsulamento delle eccezioni.
Lancio delle eccezioni standard
La sintassi generale di questa operazione ha il seguente aspetto:
raise exception
Puoi lanciare eccezioni standard come Exception, TypeError ed altre, passando loro messaggi pertinenti.
Esempio: raise Exception
def check_number(value):
if value < 0:
raise Exception("Mi dispiace, non sono ammessi numeri sotto lo zero")
try:
check_number(-5)
except Exception as e:
print(f"Eccezione catturata: {e}")
In questo esempio, se il valore è minore di zero, viene lanciata un' Exception con il messaggio "Mi dispiace, non sono ammessi numeri sotto lo zero".
Esempio: raise TypeError
def check_integer(value):
if not isinstance(value, int):
raise TypeError("Sono consentiti solo interi")
try:
check_integer("string")
except TypeError as e:
print(f"Eccezione catturata: {e}")
In questo esempio, se il valore non è un numero intero, viene lanciato un TypeError con il messaggio "Sono consentiti solo interi".
6.2 Re-incapsulamento dell'eccezione
A volte è necessario intercettare un'eccezione e lanciarne un'altra, fornendo informazioni più specifiche o utili. Questo può essere fatto usando l'operatore raise ... from, che mantiene l'eccezione originale come causa per la nuova.
La sintassi generale di questa operazione ha il seguente aspetto:
raise nuova_eccezione from vecchia_eccezione
Esempio: Re-incapsulamento dell'eccezione
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("La variabile è vuota")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Variabile vuota rilevata") from e
In questo esempio, se il valore della variabile è vuoto, viene prima lanciato un ValueError con il messaggio "La variabile è vuota". Questa eccezione viene quindi intercettata, e viene lanciata una nuova eccezione EmptyVariableError con il messaggio "Variabile vuota rilevata", con l'eccezione originale passata grazie a from.
6.3 Analisi delle eccezioni re-incapsulate
Utilizzare l'operatore raise ... from permette di mantenere le informazioni sulla catena delle eccezioni, il che può essere utile per il debugging. Puoi analizzare le eccezioni re-incapsulate e le loro cause.
Esempio di analisi delle eccezioni re-incapsulate:
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("La variabile è vuota")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Variabile vuota rilevata") from e
L'esecuzione del codice sopra riportato produrrà il seguente output:
Traceback (most recent call last): File "example.py", line 8, in
check_non_empty("") File "example.py", line 5, in check_non_empty raise ValueError("La variabile è vuota") ValueError: La variabile è vuota
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "example.py", line 10, in
raise EmptyVariableError("Variabile vuota rilevata") from e EmptyVariableError: Variabile vuota rilevata
Il primo errore (segnato in verde) è l'errore originale, che è sorto da qualche parte in profondità nel codice. A volte questi errori si verificano periodicamente, e questo è un comportamento normale del programma.
Il secondo errore (segnato in blu) è un errore di livello più alto. Il tuo programma o framework dovrebbe sapere come gestirlo. Ma se vuoi scavare più a fondo e scoprire le cause dell'errore, è proprio l'errore verde che può aiutarti.
Tutto è fatto in modo molto ragionevole.
GO TO FULL VERSION