Frage

Wir sind der Ansicht, dass eine Ausnahme bei der Initialisierung auftreten kann.Also schreiben wir try / Catch-Block.

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 wirft die Ausnahme auf einer Ebene tiefer zurück.Das bedeutet, dass der nächste Code

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

wird ausgegeben:

Exception 1
Exception 2

Warum verhält sich dieser Try / Catch-Block nicht so wie der normale Try / Catch-Block?

Vollständiges Codebeispiel: http://ideone.com/XjY2d

War es hilfreich?

Lösung

Es scheint, dass Ihre Frage ist: Warum wird ein Funktionsniveau versuchen / fang automatisch die Ausnahme?Mit einer Ausnahme von einem Konstruktion eines Objekts wird dieses Objekt als tot angesehen, bevor es zum Leben kommt.Alle ihre Unterobjekte werden zerstört.Das heißt, wenn eine Ausnahme während des Aufbaus geworfen 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.

Andere Tipps

Das Objekt, das Sie erstellen, wurde nicht wirklich aufgebaut, so dass eine einfache Rendite keine Option ist.Diese Art von Try0-Fang wird immer wiederholt (es sei denn, Sie werfen Ihre eigene Ausnahme von der Fangklausel).

Weil es kein gewöhnlicher Try-Catch-Block ist, sondern ein Try / Catch auf Funktionsebene.Es wird automatisch neu geworfen, es sei denn, Sie tun dies explizit mit throw.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top