Mam klasę, która może rzucić wyjątek w swoim konstruktorze. Jak mogę zadeklarować instancję tej klasy w bloku try/catch, nadal udostępniając ją w odpowiednim zakresie?Podejście RAII do przechwytywania wyjątków konstruktora
try { MyClass lMyObject; }
catch (const std::exception& e) { /* Handle constructor exception */ }
lMyObject.DoSomething(); // lMyObject not in scope!
Czy istnieje alternatywny sposób do osiągnięcia tego celu, przy jednoczesnym poszanowaniu RAII idiom?
Wolałbym nie używać metody init()
dla konstrukcji dwufazowej. Jedyne co mogłam wymyślić było:
MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (const std::exception& e) { /* Handle constructor exception */ }
std::shared_ptr<MyClass> lMyObjectPtr(lMyObject);
lMyObjectPtr->DoSomething();
działa OK, ale nie jestem zadowolony z surowego wskaźnik zakres i wskaźnik pośredni. Czy to tylko kolejny wątek C++?
Przenieść wywołanie metody DoSomething() na blok try? – milleniumbug
** Nigdy ** nie łapaj wyjątków kopią. Trzymaj się * stałych odniesień *. –
W drugim przykładzie, jeśli konstruktor rzucił, "lMyObject" jest niezainicjowanym wskaźnikiem. – aschepler