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