12

Uważamy, że może wystąpić wyjątek podczas inicjowania. Więc piszemy blok try/catch.Jak działa polecenie try/catch na liście inicjowania?

int f(){ 
    throw 1; 
} 

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

private: 
    int _k; 
}; 

Ale połów rzuca wyjątek na jednym poziomie głębiej. Ów oznacza, że ​​następny kod

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

wyjście wola:

Exception 1 
Exception 2 

Dlaczego ten blok try/catch nie zachowuje się w ten sam sposób jak zwykły blok try/catch?

Pełna przykładowy kod: http://ideone.com/XjY2d

Odpowiedz

16

Wygląda na to, że masz następujące pytanie: Dlaczego funkcja try/catch na poziomie funkcji automatycznie ponownie generuje wyjątek? Zrzucając wyjątek od konstrukcji obiektu, obiekt ten uważa się za martwy, zanim się ożywi. Wszystkie jego podobiekty są niszczone. To znaczy, jeśli wyjątek zostanie rzucony podczas budowy, nie ma obiektu. Gdyby wyjątek nie rzucił, dostałbyś w ręce kadłub przedmiotu. Jest to wyraźnie niepożądane.

+1

Na marginesie: automatycznie wraca tylko wtedy, gdy nie rzucasz się, aby opuścić blok "catch". –

2

Przedmiotem jesteś konstruowaniu tak naprawdę nie został skonstruowany tak prosty zwrot nie jest rozwiązaniem. Taki rodzaj próby-catch zawsze rzuca się w rejs (chyba że wyrzucisz własny wyjątek z klauzuli catch).

2

Ponieważ nie jest to zwykły blok try-catch, ale próba/catch na poziomie funkcji. Automatycznie ponownie rzuca, chyba że robisz to wyraźnie, używając throw.

+0

Wiem, że to nie jest zwykły blok. Chciałbym jednak wiedzieć, jak postanowiono pracować w ten sposób. – Seagull

+0

Następnie możesz wyjaśnić pogrubiony tekst w pytaniu. Jak inni wskazali główną ideą jest to, że biorąc pod uwagę dzwoniącego, obiekt nie mógł się skonstruować. Jedynym sposobem powiadomienia o błędzie podczas budowy jest wyjątek. – Xyand

Powiązane problemy