Cos’è un Eccezione?
- I programmi spesso si trovano ad operare in condizioni anomale:
- Il programma riceve un dato sbagliato.
- Tenta di stabilire una connessione remota che fallisce (es: time-out).
- Anche errori del run-time system:
- Divisione per zero.
- Invocazione di un metodo su riferimento nullo.
- Indice d'accesso fuori range nei vettori.
- Accesso ad una istanza nulla.
Il concetto di eccezione
Chiamare una funzione con argomenti illegali è probabilmente un errore (andrebbe opportunamente segnalato).
Il range di una funzione a volte è tutto l’insieme dei valori del tipo di ritorno.
Le funzioni hanno a volte bisogno di segnalare al loro chiamante che non sono in grado di portare a termine il loro compito perché e successo un errore o si è presentato un caso eccezionale.
Una possibilità per gestire questi casi eccezionali è quella di far restituire al chiamante un valore di tipo variante, ma e più efficace avere un meccanismo per gestire le eccezioni trasmettendo il controllo direttamente al gestore dell’eccezione, o se tale gestore manca, facendo abortire l’esecuzione.
È nato: un meccanismo di astrazione che permetta a una funzione o di tornare un valore o terminare in modo eccezionale in caso di situazioni non «normali».
Il meccanismo interrompere l’esecuzione di un sottoprogramma e propagare l’errore ad un livello più alto del programma stesso. Figurativamente, l’eccezione viene lanciata in basso, e trappata, o catturata più in alto.
Le tre fasi dell’Eccezione
- Sollevamento dell’eccezione (throwing exception) viene generato una segnalazione di un evento anomalo.
- Cattura dell’eccezione (catching exception) un pezzo di codice cattura il segnale di eccezione per trattarla opportunamente.
- Trattamento dell’eccezione (handling exception) informare l’utente dell’evento - cerca eventualmente di riparare - ripristinare uno stato consistente con la computazione in atto.
La propagazione dell'Eccezione
Se l’eccezione non viene intercettata e gestita dove si verifica, si propaga attraverso la gerarchia delle chiamate di metodi (ovvero lo stack dei record di attivazione). Vengono chiusi tutti i record di attivazione fino ad incontrare un blocco che gestisca l'eccezione. Se esso non viene trovato il programma si chiude, la chiusura del programma, per futili motivi, è da evitare in quanto c'è il rischio di perdita di importanti dati.
I Vantaggi
Ciò permette di scrivere il codice sorgente assumendo che non vi siano malfunzionamenti, demandando a routine specializzate il compito di risolvere eventuali problemi incontrati durante il percorso.
In contrasto con l’approccio di linguaggi meno evoluti come il C standard, dove in pratica ogni condizione di errore deve essere controllata “sul posto”, si ottiene un codice più chiaro e una gestione più logica degli errori.
Nel caso di linguaggio ad oggetti, le eccezioni sono degli oggetti come tutti gli altri ed è possibile quindi usarle per memorizzare una notevole mole di informazioni riguardo all’errore occorso.
Gli Svantaggi
Se non gestite correttamente possono far chiudere il programma e/o saltare una mole considerevole di istruzioni.
I costrutti sono spesso lenti e non ben ottimizzati.