Come funziona la lista Try / Catch in Initialization?
-
12-12-2019 - |
Domanda
Consideriamo che potrebbe accadere un'eccezione nell'inizializzazione.Quindi scriviamo il blocco di prova / cattura.
int f(){
throw 1;
}
class A
{
public:
A() try : _k(f())
{}
catch (int)
{
std::cout << "Exception 1" << std::endl;
}
private:
int _k;
};
.
Ma la cattura eccezione di retrows su un livello più profondo.Questo significa che il prossimo codice
try
{
A a;
} catch(int)
{
std::cout << "Exception 2" << std::endl;
}
.
verrà emesso:
Exception 1
Exception 2
.
Perché questo blocco try / catch si comporta allo stesso modo del blocco di prova / cattura ordinario?
Esempio di codice completo: http://ideone.com/xjy2d
Soluzione
Sembra che la tua domanda sia: perché un livello di funzionamento prova / cattura automaticamente ritornare il THE TRANCEY?Con aver lanciato un'eccezione da una costruzione di un oggetto, questo oggetto è considerato morto prima che arrivi alla vita.Tutti i suoi sottoogetti sono distrutti.Cioè, se viene generata un'eccezione durante la costruzione, non ci sono oggetti.Se l'eccezione non avrebbe lanciato, avresti avuto uno scafo di un oggetto nelle tue mani.Questo è chiaramente non desiderabile.
Altri suggerimenti
L'oggetto che stai costruendo non è stato davvero costruito, quindi il ritorno semplice non è un'opzione.Questo tipo di Try0-Catch sempre ritorni (a meno che non butti la tua eccezione dalla clausola Catch).
Perché non è un normale blocco da try-catch ma un try / catch a livello di funzione.Si ritorna automaticamente a meno che tu non lo faccia esplicitamente utilizzando throw
.