Cerca nel sito:
ricerca
avanzata

Frasi Celebri...

Per guidare gli altri cammina alle loro spalle.

Lao Tzu 

Sondaggio:

Quale auto per non passare inosservati?

Jaguar
Mercedes
Ferrari
Maserati
Bmw
AlfaRomeo
Bugatti

visualizza risultati


 

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.

 

successivo
–«  INDICE  »–

 

 

 

 
Powered by paper&pencil (carta&matita ) - Copyright © 2001-2019 Cataldo Sasso