Fang Ausnahme Objekte Bezug genommen wird, Provisorien, Lebensdauer Fragen

StackOverflow https://stackoverflow.com/questions/1860064

  •  13-09-2019
  •  | 
  •  

Frage

Betrachten Sie den folgenden Code ein:

#include <iostream>
#include <stdexcept>

void foo()
{
    throw std::runtime_error("How long do I live?");
}

int main()
{
    try
    {
        foo();
    }
    catch (std::runtime_error& e)
    {
        std::cout << e.what() << std::endl;
    }
}

Warum kann ich die Ausnahme durch Bezugnahme fangen, ist ein R-Wert nicht std::runtime_error("How long do I live?")?

Wie kommt das Ausnahmeobjekt im catch-Block noch am Leben ist?

Wo genau geworfen Ausnahmeobjekte gespeichert? Was ist ihre Lebensdauer?

Keine korrekte Lösung

Andere Tipps

In der C ++ Standard Abschnitt 15.1.4:

  

Der Speicher für die temporäre Kopie   die Ausnahme ausgelöst wird, ist   in einer nicht spezifizierten Weise zugeordnet,   mit Ausnahme der in 3.7.3.1 festgestellt. Die   vorübergehend anhält, solange es ist   wobei ein Handler für die Ausführung   Ausnahme: . Insbesondere dann, wenn ein   Handler beendet durch einen Wurf auszuführen;   Feststellung, daß die Steuerung geht zu   ein anderer Handler für die gleichen   Ausnahme, so dass die vorübergehende bleibt.   Wenn der letzte Handler ausgeführt wird   für die Ausnahme-Exits mit allen Mitteln   andere als werfen; das temporäre Objekt   wird zerstört und die Umsetzung   kann der Speicher für die ausplanen   temporäres Objekt; eine solche   Aufhebung der Zuordnung ist in einem nicht näher getan   Weg. Die Zerstörung erfolgt   unmittelbar nach der Zerstörung   das Objekt in der deklarierte   Ausnahme-Deklaration in dem Handler.

Beachten Sie, dass in C ++ -. Standard-talk, ein Lenker einen catch Block mit dem richtigen Argumente Typ bezeichnen

Eine ausgelöste Ausnahme ist keine vorübergehende - der Compiler-generierte Ausnahmecode hält eine permanente Kopie davon. So können Sie es auf eine nicht konstante Referenz binden.

[Bearbeiten] Ich überprüfe nur den Standard und es bezieht sich eigentlich auf eine temporäre Kopie. Allerdings ist die Lebensdauer der temporären garantiert mindestens so lang wie die der Exception-Handler sein.

Wie Neil sagte, gibt es interne Compiler Magie geht. Beachten Sie außerdem, dass der Compiler erstellen darf eine beliebige Anzahl von Kopien des Ausnahmeobjekts.

Ein großes Lob für den Versuch, die Details der Sprache zu verstehen. Zur gleichen Zeit, IMHO, ist es viel wichtiger, zu verstehen, warum Sie sollte eine Ausnahme durch Verweis fangen (und werfen es nach Wert), als warum Sie können .

Die Menschen verwenden in der Regel eine Hierarchie von Ausnahmeklassen und durch Bezugnahme Fang ermöglicht es Ihnen, Polymorphismus, zu nutzen und eine Ausnahme von der Basisklasse zu fangen, wenn es keine Notwendigkeit einzelne Ausnahme ist separat Typen zu behandeln. Wenn Sie nicht durch Verweis fangen können, hätten Sie eine catch Klausel für jede mögliche Art von Ausnahme zu schreiben, die in der try Klausel geworfen werden können.

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