Ho una classe che può generare un'eccezione nel suo costruttore. Come posso dichiarare un'istanza di quella classe in un blocco try/catch, pur continuando a renderla disponibile nel giusto ambito?Approccio RAII alla cattura delle eccezioni del costruttore
try { MyClass lMyObject; }
catch (const std::exception& e) { /* Handle constructor exception */ }
lMyObject.DoSomething(); // lMyObject not in scope!
Esiste un modo alternativo per raggiungere questo obiettivo, nel rispetto del RAII linguaggio?
Preferirei non utilizzare un metodo init()
per la costruzione in due fasi. L'unica altra cosa che ho potuto venire con era:
MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (const std::exception& e) { /* Handle constructor exception */ }
std::shared_ptr<MyClass> lMyObjectPtr(lMyObject);
lMyObjectPtr->DoSomething();
funziona bene, ma non sono felice con il puntatore prima in ambito e puntatore indiretto. È solo un'altra verruca C++?
Spostare la chiamata del metodo DoSomething() al blocco try? – milleniumbug
** Mai ** cattura le eccezioni per copia. Attacca con * riferimenti costanti *. –
Nel secondo esempio, se il costruttore ha gettato, 'lMyObject' è un puntatore non inizializzato. – aschepler