Fang Ausnahme Objekte Bezug genommen wird, Provisorien, Lebensdauer Fragen
-
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.