Le eccezioni
Una eccezione è una situazione
anomala o inaspettata, che si verifica durante
l'esecuzione di un programma (a run-time), interrompendone la
normale sequenza delle istruzioni e terminando il programma in modo imprevisto (crash).
Le eccezioni vengono solitamente sollevate dal sistema operativo
o dal runtime (macchine
virtuali, es. JVM) quando si verificano eventi imprevisti.
Il
programma può intercettare e gestire queste eccezioni per evitare il crash o per eseguire azioni
correttive.
Le principali cause di eccezioni sono:
-
errori dovuti al programmatore, ossia situazioni che lo
sviluppatore non ha previsto durante la progettazione dell'applicazione.
Attenzione, non si tratta di errori di sintassi, che sarebbero segnalati dal compilatore, quindi a compile-time, ma bensì di errori di progetto che possono manifestarsi in fase di esecuzione (run-time).
Qualche esempio potrebbe essere un valore che eccede i limiti consentiti dal tipo di variabile utilizzata (overflow, underflow), una divisione per zero, una radice quadrata di un numero negativo, iterazioni infinite (loop), oppure funzioni ricorsive che non terminano. -
input utente errato, ovvero inserimento di valori non
consentiti o non attesi dall'applicazione.
Un esempio potrebbe essere l'inserimento di caratteri alfabetici al posto di un input numerico, oppure un decimale con simbolo di separatore errato, oppure una data non valida, e così via.
Un bravo programmatore deve prevedere queste eventualità e gestirle opportunamente. - violazioni di sicurezza, ossia l'accesso ad una risorsa per la quale non si dispone delle necessarie autorizzazioni, ad esempio un file o una cartella, l'accesso ad aree di memoria non consentite, il tentativo di esecuzione di operazioni che non si è autorizzati a compiere (es. creazione/cancellazione di un utente, creazione/cancellazione di un file o di una cartella), l'utilizzo di una risorsa (es. stampante) non autorizzato.
- non disponibilità di risorse, ossia l'impossibilità di accedere ad una risorsa (es. stampante, file) in rete, ad un servizio su internet, ad un database, la richiesta di accesso ad un file o cartella inesistente, oppure il superamento del tempo massimmo (timeout) nel tentativo di accesso ad una risorsa, il tentativo di modifica di un file già aperto in modifica da un'altra applicazione o un altro utente, l'esaurimento della quantità di memoria utilizzabile dal programma.
In tutte queste situazioni, l'esecuzione del programma viene arrestata bruscamente (crash),
con potenziali danni su tutte le risorse in uso dal programma al
momento dell'eccezione e
conseguente possibile perdita irrecuperabile di dati.
Per queste ragioni è fondamentale che il programmatore cerchi di prevedere tutte le situazioni
in cui il programma potrebbe trovarsi, per poterle intercettare e
gestire correttamente con lo
scopo di minimizzare il rischio di danni e/o perdita di dati.
Questa abilità/competenza condurrebbe alla realizzazione di programmi robusti che, come già studiato
definiendo il concetto di algoritmo e le relative properità, possano comportarsi correttamente
nella maggior parte delle situazioni.