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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top