Condividi tramite


Modalità di valutazione dei blocchi catch (C++)

C++ consente di generare eccezioni di qualsiasi tipo, sebbene in genere sia consigliabile generare i tipi derivati da std::exception. Un'eccezione C++ può essere intercettata da un catch gestore che specifica lo stesso tipo dell'eccezione generata o da un gestore che può intercettare qualsiasi tipo di eccezione.

Se il tipo di eccezione generata è una classe, che dispone inoltre di una o di più classi base, tale eccezione può essere rilevata da gestori che accettano le classi base del tipo dell'eccezione oppure dai riferimenti alle basi del tipo dell'eccezione. Si noti che quando un'eccezione viene rilevata da un riferimento, viene associata all'oggetto effettivo dell'eccezione generata. In caso contrario, è una copia (molto simile a un argomento di una funzione).

Quando viene generata un'eccezione, può essere rilevata dai tipi di catch gestori seguenti:

  • Gestore che accetta qualsiasi tipo (mediante la sintassi costituita dai puntini di sospensione).

  • Gestore che accetta lo stesso tipo dell'oggetto eccezione; perché è una copia e constvolatile i modificatori vengono ignorati.

  • Gestore che accetta un riferimento allo stesso tipo dell'oggetto eccezione.

  • Gestore che accetta un riferimento a un const oggetto o volatile di uno stesso tipo dell'oggetto eccezione.

  • Gestore che accetta una classe base dello stesso tipo dell'oggetto eccezione; poiché è una copia e constvolatile i modificatori vengono ignorati. Il catch gestore per una classe base non deve precedere il catch gestore per la classe derivata.

  • Gestore che accetta un riferimento a una classe base dello stesso tipo dell'oggetto eccezione.

  • Gestore che accetta un riferimento a una const classe o volatile di una classe di base dello stesso tipo dell'oggetto eccezione.

  • Gestore che accetta un puntatore a un elemento in cui un oggetto del puntatore generato può essere convertito tramite le regole di conversione standard del puntatore.

L'ordine in cui catch vengono visualizzati i gestori è significativo, perché i gestori per un determinato try blocco vengono esaminati in ordine di aspetto. Ad esempio, l'inserimento del gestore per una classe base prima del gestore per una classe derivata è un errore. Dopo aver trovato un gestore corrispondente catch , i gestori successivi non vengono esaminati. Di conseguenza, un gestore con puntini di sospensione catch deve essere l'ultimo gestore per il relativo try blocco. Ad esempio:

// ...
try
{
    // ...
}
catch( ... )
{
    // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
    cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
    // Handle CExcptClass exception here.
}

In questo esempio, il gestore dei puntini di sospensione catch è l'unico gestore esaminato.

Vedi anche

Procedure consigliate C++ moderne per le eccezioni e la gestione degli errori