Sicurezza rispetto alle eccezioni
# Sicurezza rispetto alle eccezioni

In informatica, la sicurezza rispetto alle eccezioni (exception safety) denota l'approccio di un programma in termini di robustezza nella gestione delle eccezioni.

## Livelli di sicurezza

Quattro livelli di sicurezza rispetto alle eccezioni comunemente considerati sono:

* No exception safety: il programma non offre alcuna garanzia nel caso venga lanciata un'eccezione.
* Basic exception safety, anche nota come no-leak guarantee: l'operazione può fallire con effetti collaterali, ma vi è la garanzia che gli invarianti siano preservati e che non avvengano perdite di risorse (ad esempio memory leak).
* Strong exception safety, anche nota come semantica semantica transazionale: l'operazione può fallire, ma in caso di fallimento vi è la garanzia che l'operazione non abbia alcun effetto collaterale. Raggiungere questo livello di sicurezza tipicamente ha un costo addizionale in termini di tempo di esecuzione e memoria, perché spesso richiede di eseguire copie addizionali dei dati allo scopo di garantire la conservazione degli input originali in caso di fallimento.
* No-throw/no-fail: il completamento dell'operazione è garantito, e nessuna eccezione verrà lanciata in alcun caso.

## Esempio

Si consideri l'implementazione dell'operazione di aggiunta di un elemento in un vettore (come std::vector in C++ o ArrayList in Java). La funzione deve aggiungere il nuovo oggetto al contenitore interno, operazione che potrebbe richiedere l'allocazione di nuova memoria se il contenitore non ha sufficiente spazio a disposizione, e aggiornare un contatore del numero di elementi. Il seguente è un possibile esempio di comportamento della funzione per ognuno dei quattro livelli di sicurezza rispetto alle eccezioni.

* No exception safety: il fallimento dell'operazione può causare la presenza di contenuto corrotto nel vettore, un valore errato nel contatore di elementi, o un memory leak.
* Basic exception safety: in caso di fallimento, il contenitore viene lasciato in uno stato coerente (ad esempio, il contatore riflette il numero reale di elementi) e non avviene alcun memory leak. Tuttavia, il nuovo elemento o il contenuto del vettore possono andare perduti.
* Strong exception safety: l'allocazione di memoria è eseguita inizialmente, e il buffer del vettore viene trasferito solo in caso l'allocazione avvenga con successo. In caso di fallimento, lo stato del vettore è preservato.
* No-throw/no-fail: in aggiunta al caso precedente, la funzione ha un valore di ritorno che indica se l'operazione sia stata completata con successo o se l'inserimento non sia possibile (ad esempio, per mancanza di risorse).
