Video: Nuovo Corso C++11 ITA 152: le eccezioni / 1 2024
Una funzione C ++ che assegna risorse localmente potrebbe aver bisogno di rilevare un'eccezione, eseguire qualche elaborazione e quindi ricrearla nella catena dello stack. Considera il seguente esempio:
void fileFunc () {ofstream * pOut = new ofstream ("File. Txt"); otherFunction (); delete pOut;}
Come molti programmatori sanno, la memoria allocata da new non viene restituita automaticamente all'heap. Se otherFunction () dovesse lanciare un'eccezione, il controllo uscirebbe dal programma senza richiamare delete, e la memoria allocata all'inizio di fileFunc () andrebbe persa.
Per evitare questo problema, fileFunc () può includere un catch (…) per catturare qualsiasi eccezione generata:
void fileFunc () {ofstream * pOut = new ofstream ("File.txt")); prova {otherFunction (); elimina pOut;} catch (…) {elimina pOut; throw;}}
All'interno di questa frase, fileFunc () restituisce la memoria allocata in precedenza all'heap. Tuttavia, non è in grado di elaborare il resto dell'eccezione perché non ha idea di cosa possa essere andato storto. Non sa nemmeno quale tipo di oggetto ha appena catturato.
La parola chiave throw senza argomenti ripassa l'oggetto eccezione corrente eseguendo il backup della catena su una funzione che può elaborare correttamente l'errore.