12

Wir denken, dass eine Ausnahme bei der Initialisierung passieren kann. Also schreiben wir try/catch block.Wie funktioniert der try/catch in der Initialisierungsliste?

int f(){ 
    throw 1; 
} 

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

private: 
    int _k; 
}; 

Aber der Fang retrowers Ausnahme auf einer Ebene tiefer. Das ist, bedeutet, dass im nächsten Code

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

AUSGABE:

Exception 1 
Exception 2 

Warum diese try/catch-Block nicht auf die gleiche Weise verhält sich wie gewöhnliche try/catch-Block?

Vollcodebeispiel: http://ideone.com/XjY2d

Antwort

16

Es scheint Ihre Frage ist: Warum versucht eine Funktionsebene versuchen/fangen automatisch die Exceptoin? Wenn man eine Ausnahme von der Konstruktion eines Objekts wirft, wird dieses Objekt als tot betrachtet, bevor es zum Leben erwacht. Alle Unterobjekte sind zerstört. Das heißt, wenn während der Konstruktion eine Ausnahme ausgelöst wird, gibt es kein Objekt. Wenn die Ausnahme nicht werfen würde, würden Sie einen Rumpf eines Objekts in Ihre Hände bekommen. Dies ist eindeutig nicht wünschenswert.

+1

Als Anmerkung: Es wird nur automatisch neu gestartet, wenn Sie sich nicht werfen, um den 'catch' Block zu verlassen. –

2

Das Objekt, das Sie hat ist die Konstruktion nicht wirklich gebaut worden, so einfache Rückkehr ist keine Option. Diese Art von try0-catch wird immer erneut ausgeführt (es sei denn, Sie werfen Ihre eigene Ausnahme aus der catch-Klausel).

2

Weil es kein gewöhnlicher try-catch-Block ist, sondern ein try/catch auf Funktionsebene. Es wird automatisch erneut ausgef \ u00fchrt, es sei denn, Sie m \ u00fcssen es explizit unter Verwendung von throw.

+0

Ich weiß, dass dies kein gewöhnlicher Block ist. Aber ich würde gerne wissen, wie entschieden wurde, so zu arbeiten. – Seagull

+0

Dann könnten Sie den fett gedruckten Text in der Frage klären. Wie andere darauf hingewiesen haben, besteht die Hauptidee darin, dass das Objekt, wenn man den Aufrufer betrachtet, nicht konstruieren konnte. Die einzige Möglichkeit, während der Konstruktion einen Fehler zu melden, ist eine Ausnahme. – Xyand

Verwandte Themen