Esiste in C++ la possibilità di usare un meccanismo per la gestione degli errori molto meno oneroso per il programmatore del classico "controlla il valore di ritorno della procedura", e inoltre ha il vantaggio di evitare che ogni programmatore segua la propria personale convinzione circa la gestione di tali errori.
Alcune classi C++ possono in determinati casi segnalare condizioni di errore tramite un costrutto throw ErrObject, dove ErrObject è un tipo dati primitivo o definito dall'utente.
Si dice che l'istruzione throw ErrOject "solleva un'eccezione".
Quando un'eccezione viene sollevata, l'esecuzione normale del programma viene sospesa, e il runtime cerca nello stack di chiamate la prima funzione in grado di gestire un'eccezione di quel tipo, se non viene trovato nessun gestore il programma viene terminato.
In pratica
supponi che nel costruttore della tua classe X devi connetterti con una socket:
codice:
X::X(int socket)
{
string err;
if(socket==-1)
{
err = "socket non valido";
throw err; //solleva eccezione
}
....
}
....
try{
X * pX = new X(sock);
}
catch(string e)
{
cout << e;
exit(1);
}
....
il vantaggio dei blocchi try è che puoi per ogni blocco di codice inserirne uno unico per dover evitare di rendere troppo ridondante il codice
codice:
try{
questo(); //questo potrebbe generare un errore del tipo DetailedErrDescr
quello(); //quello potrebbe generare un errore del tipo UltraDetailedErrDescr;
quell_altro(); //quell_altro genera eccezioni di int*
quell_altro_ancora(); //quell_altro_ancora genera errori di tipo DetailedErrDescr
}
catch(DetailedErrDescr e)
{
....
}
catch(UltraDetailedErrDescr e)
{
....
}
catch(...) //questa riga vuol dire "cattura eccezioni di qualunque tipo".
//Ovvio non puoi avere informazioni sull'errore
{
....
}