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.