Casi particolari
Esistono ancora due problemi da affrontare
- Cosa fare se una funzione solleva una eccezione non specificata tra quelle
possibili;
- Cosa fare se non si trova un blocco try seguito da una catch compatibile
con quel tipo di eccezione;
Esaminiamo il primo punto.
Per default una funzione che non specifica una lista di possibili tipi di eccezione
puo` sollevare una eccezione di qualsiasi tipo. Una funzione che specifica una
lista dei possibili tipi di eccezione e` teoricamente tenuta a rispettare tale
lista, ma nel caso non lo facesse, in seguito ad una throw di tipo non previsto,
verrebbe eseguita immediatamente la funzione predefinita unexpected() .
Per default unexpected() chiama terminate() provocando
la terminazione del programma. Tuttavia e` possibile alterare tale comportamento
definendo una funzione che non riceve alcun parametro e restituisce void
ed utilizzando set_unexpected() come mostrato nel seguente esempio:
#include < exception >
using namespace std;
void MyUnexpected() {
/* ... */
}
typedef void (* OldUnexpectedPtr) ();
int main() {
OldUnexpectedPtr = set_unexpected(MyUnexpected);
/* ... */
return 0;
}
unexpected() e set_unexpected() sono dichiarate nell'header
< exception > . E` importante ricordare che la vostra unexpected
non deve ritornare, in altre parole deve terminare l'esecuzione del programma:
#include < exception >
#include < stdlib.h >
using namespace std;
void MyUnexpected() {
/* ... */
abort(); // Termina il programma
}
typedef void (* OldHandlerPtr) ();
int main() {
OldhandlerPtr = set_unexpected(MyUnexpected);
/* ... */
return 0;
}
Il modo in cui terminate l'esecuzione non e` importante, quello che conta e`
che la funzione non ritorni.
set_unexpected() infine restituisce l'indirizzo della unexpected
precedentemente installata e che in talune occasioni potrebbe servire.
Rimane da trattare il caso in cui in seguito ad una eccezione, risalendo i blocchi
applicativi, non si riesca a trovare un blocco try oppure una catch compatibile
con il tipo di eccezione sollevata.
Nel caso si trovi un blocco try ma nessuna catch idonea, il processo viene iterato
fino a quando una catch adatta viene trovata, oppure non si riesce a trovare
alcun altro blocco try. Se nessun blocco try viene trovato, viene chiamata la
funzione terminate() .
Anche in questo caso, come per unexpected() , terminate()
e` implementata tramite puntatore ed e` possibile alterarne il funzionamento
utilizzando set_terminate() in modo analogo a quanto visto per
unexpected() e set_unexpected() (ovviamente la nuova
terminate non deve ritornare).
set_terminate() restituisce l'indirizzo della terminate()
precedentemente installata.
|