12

Consideriamo che potrebbe verificarsi un'eccezione nell'inizializzazione. Quindi scriviamo try/catch block.Come funziona la lista di inizializzazione try/catch?

int f(){ 
    throw 1; 
} 

class A 
{ 
public: 
    A() try : _k(f()) 
    {} 
    catch (int) 
    { 
     std::cout << "Exception 1" << std::endl; 
    } 

private: 
    int _k; 
}; 

Ma l'eccezione di rilancio su un livello più in profondità. Quello significa che il codice successivo

try 
{ 
    A a; 
} catch(int) 
{ 
    std::cout << "Exception 2" << std::endl; 
} 

uscita volontà:

Exception 1 
Exception 2 

Perchè questo blocco try/catch non si comporta allo stesso modo di ordinaria blocco try/catch?

codice completo esempio: http://ideone.com/XjY2d

risposta

16

Sembra che la tua domanda sia: perché un try/catch a livello di funzione ripassa automaticamente l'eccezione? Con il lancio di un'eccezione da una costruzione di un oggetto, questo oggetto è considerato morto prima di prendere vita. Tutti i suoi sottooggetti sono distrutti. Cioè, se un'eccezione viene lanciata durante la costruzione non c'è alcun oggetto. Se l'eccezione non fosse lanciata, avresti uno scafo di un oggetto tra le mani. Questo chiaramente non è desiderabile.

+1

Come nota: si ripassa automaticamente se non si butta per uscire dal blocco "catch". –

2

L'oggetto si sta costruendo non è stato realmente costruito, così semplice ritorno non è un'opzione. Questo tipo di try0-catch rimbalza sempre (a meno che non si lanci la propria eccezione dalla clausola catch).

2

Perché non è un blocco try-catch ordinario ma un try/catch a livello di funzione. Si riavvia automaticamente a meno che non lo fai esplicitamente utilizzando throw.

+0

So che questo non è un blocco normale. Ma mi piacerebbe sapere in che modo è stato deciso di lavorare in questo modo. – Seagull

+0

Quindi potresti chiarire il testo in grassetto nella domanda. Come altri hanno sottolineato l'idea principale è che considerando il chiamante, l'oggetto non è riuscito a costruire. L'unico modo per notificare un errore durante la costruzione è l'eccezione. – Xyand

Problemi correlati