Ja, es ist möglich, wenn Sie den gesamten Code setzen in der try
Klausel, für Beispiel durch eine mit function try block (unnötige Verschachtelung und Scoping zu vermeiden):
bool foo() try
{
Bar x;
x.doSomething();
return true;
}
catch (std::exception const& e)
{
return false;
}
Oder im try
Klausel Aufruf einer anderen Funktion, die die eigentliche Arbeit macht:
void real_foo()
{
Bar x;
x.doSomething();
}
bool foo() try
{
real_foo();
return true;
}
catch (std::exception const& e)
{
return false;
}
Beachten Sie, dass es oft keine gute Idee ist, Ausnahmen in einem Konstruktor auszulösen, da dies die Konstruktion des Objekts stoppt und dessen Destruktor nicht aufgerufen wird.
Wie Holt erwähnt, wird dies auch Ausnahmen von dem doSomething
Anruf fangen. Es gibt zwei Möglichkeiten, das zu lösen:
Die einfache und standardisierte Möglichkeit: Verwenden Zeiger.
Verwenden Sie zweistufige Konstruktion: Verwenden Sie einen Standardkonstruktor, der keine Ausnahmen auslösen kann, und rufen Sie dann eine spezielle "Konstrukt" -Funktion auf, die Ausnahmen auslösen kann.
Der zweite Weg war üblich, vor C++ standardisiert war und ausführlich in Code für die Symbian system verwendet. Es ist nicht mehr üblich, da die Verwendung von Zeigern viel einfacher und einfacher ist, besonders heute mit guten Smartpointern. Ich empfehle wirklich nicht den zweiten Weg im modernen C++.
Der einfachste Weg ist natürlich, sicherzustellen, dass der Konstruktor keine Ausnahmen überhaupt werfen kann, oder wenn einer geworfen wird, dann sind sie von der Natur, dass das Programm nicht fortgesetzt werden kann und das Programm beendet wird. Wie in den Kommentaren zu Ihrer Frage angemerkt, sind Ausnahmen in C++ teuer, und dann haben wir auch das Problem der abgebrochenen Konstruktion, und alle Ausnahmen in C++ sollten nur in Ausnahmefällen verwendet werden. C++ ist kein Java, Sie sollten es nicht als solches behandeln, selbst wenn es ähnliche Konstrukte in beiden Sprachen gibt.
Wenn Sie immer noch Ausnahmen aus dem Konstruktor werfen möchten, gibt es tatsächlich eine dritte Möglichkeit, nur diejenigen zu fangen: Verwenden Sie eines der oben genannten Code-Beispiel, und nur bestimmte Ausnahmen werfen, doSomething
kann nie werfen und dann diese spezifischen fangen nur Konstruktoren.
Ja. Setzen Sie alles auf den erfolgreichen Pfad im try-Block. Sie bleiben im Funktionsumfang. – StoryTeller
@StoryTeller was, wenn ich keine Ausnahmen von z. 'x.doSomething()', nur Ausnahmen vom Konstruktor? –
@AndrewSun Verwenden Sie verschiedene Ausnahmen oder setzen Sie 'x.doSomething()' in einen inneren Ausnahmeblock. – Holt