wie verwenden von try-catch mit Konstruktoren?
Sah ich viele Beispiele, aber ich bin nicht in der Lage zu verstehen, wie man mit try-catch-mit einem einfachen Konstruktor, schrieb ich ein Beispiel-Programm:
class A
{
public:
try {
A()
{ cout << "in costr\n"; throw 10;}
}//try closed
catch (int a)
{ cout << "caught 1 \n"; }
};
main()
{
A *ptr = new A;
}
- Dieses Programm gibt einen Kompilierungsfehler
- Wenn die Ausnahme abgefangen ist, was geschieht, zu widersprechen ??
- Gut, da hat der code einen Kompilierungsfehler, können wir nicht beantworten, Frage 2, weil der code sinnlos ist.
- Nur ein Tip für die Zukunft, wenn Sie eine Frage stellen über Kompilierungsfehler, fügen Sie die genauen Fehlermeldungen um die Frage, und alle Nachrichten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
try/catch
code soll zusammen, man kann das eine nicht ohne das andere. So etwas wie dies ist, was Sie nach:Siehe das folgende Programm für eine komplette funktionierende Beispiel:
Mit der
throw 42
dort, Sie sehen:Bedeutung, dass
main
gefangen hat, die exception aus dem Konstruktor. Ohne diethrow
Sie sehen:weil alles geklappt hat.
Die wichtigsten Probleme mit Ihrem code zu sein scheinen:
Haben Sie eine
try
Erklärung, wo sollte es nicht sein.Try/catch
- Blöcke sollte in der Regel innerhalb eine Funktion oder Methode haben Sie es sofort nach dempublic
Stichwort.Wenn Sie werfen eine exception aus dem Konstruktor, den Sie nicht fangen es in den Konstruktor. Stattdessen fangen Sie es in den code, der genannt Konstruktor (
main
in diesem Fall).Wie bereits erwähnt,
try
undcatch
gehen zusammen, Sie sind keine eigenständigen Entitäten.Wenn Sie sind versucht
throw
undcatch
innerhalb des Konstruktors, werden Sie noch brauchen, um es innerhalb den Konstruktor selbst, so etwas wie:gibt Sie:
Hinweis speziell wie die
try/catch
block ist vollständig und innerhalb der Konstruktor-Funktion.try
ist außerhalb der code-Bereich, die Sie brauchen, um es in irgendeine Art von Funktion, nicht sofort nach derpublic
. Es ist ausführbarer code, nachdem alle. In jedem Fall, wenn Sie werfen eine exception aus dem Konstruktor, Sie nicht catch im Konstruktor selbst, Sie fangen Sie in was auch immer genannt der Konstruktor. Siehe mein code für ein Beispiel.Das Problem der Ausnahmen ausgelöst, während Konstruktoren behandelt wird Funktions-try-Blöcke:
Aber das Szenario, die Sie ansprechen, ist eine andere aus Ihrem Beispiel. Funktions-try-Blöcke sind erforderlich, wenn der Konstruktor der Klasse reserviert Ressourcen müssen freigegeben werden. Da der Destruktor der Klasse wird nicht ausgeführt, wenn der Konstruktor werfen (es gibt nichts zu zerstören, wird die Klasse nicht konstruieren, um mit zu beginnen) ein Weg zur Lösung des Problems ist mit der Funktion try-Blöcke auf der Konstruktor. Beachten Sie, dass die Konstruktor-Funktion try-Blöcke muss erneut ausgelöst werden, oder eine Ausnahme die ursprüngliche Ausnahme, Sie können nicht schweigen die Ausnahme erwischt.
Für eine ausführlichere Diskussion der Frage Sie Fragen (was ist der Gültigkeitsbereich und Lebensdauer eines Objektes in Anwesenheit der Ausnahme während construcors) siehe GOTW#66.
Wenn das, was Sie tun möchten, ist sich mit einer Ausnahme in den Konstruktor ohne erneute auslösen, dann müssen Sie die try-catch-block innen den Konstruktor, oder rund um die constructos Initialisierungs-Liste:
Meinst du so etwas wie dieses:
Sie haben, um zu versuchen und fangen zusammen...
Hinzuzufügen zu den Antworten, wenn Sie prüfen wollen, für die Ausnahmen beim Objekt Bau selbst, könnte man denken, dass einige Konstrukte wie diese:
Hier, sehen Sie, wie werfen von der base gefangen, bevor es zu weiteren Bau versucht, und dies führt zu Objekt-Bau zu scheitern, während die Bereitstellung ausreichender Informationen. In diesem Fall, es ist ein triviales Beispiel. In aktuellen Szenario, möchten Sie vielleicht, um zu verbreiten Ihre Ausnahme unten die call-stack, statt es herunterzuschlucken.