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
const
volatile
i modificatori vengono ignorati.Gestore che accetta un riferimento allo stesso tipo dell'oggetto eccezione.
Gestore che accetta un riferimento a un
const
oggetto ovolatile
di uno stesso tipo dell'oggetto eccezione.Gestore che accetta una classe base dello stesso tipo dell'oggetto eccezione; poiché è una copia e
const
volatile
i modificatori vengono ignorati. Ilcatch
gestore per una classe base non deve precedere ilcatch
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 ovolatile
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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per