title: Sicurezza rispetto alle eccezioni
text: # 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).
  