|
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.
|