Natürlich nur zur Verlängerung des try
Block die Verwendung von a
enthalten ist die einfachste Lösung.
Auch wenn Sie wirklich planen, exit(1)
oder auf andere Weise das Programm bei einem Fehler abzubrechen, dann stellen Sie einfach keinen try
Block hier überhaupt. Die Ausnahme wird sich ausbreiten und das Programm abbrechen, wenn es nicht abgefangen wird.
Eine Alternative ist std::optional
zu verwenden. Dies ist die gleiche Art von Konzept wie die Verwendung eines Zeigers, aber es verwendet die automatische Zuweisung, sodass Sie weniger wahrscheinlich ein Speicherleck erstellen. Dies ist derzeit experimentelle Status; Sie können boost::optional
stattdessen verwenden, wenn Ihr Compiler nicht std::experimental::optional
hat:
#include <experimental/optional>
using std::experimental::optional;
using std::experimental::in_place;
// ...
optional<ClassA> a;
try
{
a = optional<ClassA>(in_place, s);
}
catch(...)
{
// display message or something
}
std::string result;
if (a)
result = a->GetSomething();
Ich mag wiederholen würde aber, dass dies ein bisschen ein Spaghetti-Stil ist, und es wäre besser, den Code anders zu gestalten, so dass Sie überprüfen nicht ständig, ob die Konstruktion erfolgreich war oder fehlgeschlagen ist.
Dies erfordert ClassA
beweglich oder kopierbar sein. Das in_place
ist ein spezielles Argument, das einen perfekten Weiterleitungskonstruktor für die verbleibenden Argumente aufruft. Ohne in_place
können Sie nur ein tatsächliches ClassA
als Konstruktorargument angeben, es berücksichtigt keine impliziten Konvertierungen zu ClassA
. (So vermeidet optional
die Mehrdeutigkeit zwischen Kopie-Konstruktion und Listen-Initialisierung von Objekt des gleichen Typs).
Warum nicht im 'try' Block? Wenn Sie eine Ausnahme auslösen, werden Sie sowieso "exit". – MatthewRock
Die Frage ergibt keinen Sinn: Wenn die Konstruktion von 'a' eine Ausnahme auslöst, ist' a' sowieso nutzlos. –
'catch' muss Zeug nach sich haben, z.B. 'catch (...)' –