Tôi có một lớp có thể ném một ngoại lệ trong hàm tạo của nó. Làm thế nào tôi có thể khai báo một thể hiện của lớp đó trong một khối try/catch, trong khi vẫn làm cho nó có sẵn trong phạm vi bên phải?Cách tiếp cận RAII để bắt các ngoại lệ của nhà xây dựng
try { MyClass lMyObject; }
catch (const std::exception& e) { /* Handle constructor exception */ }
lMyObject.DoSomething(); // lMyObject not in scope!
Có cách nào khác để thực hiện điều này, trong khi tôn trọng thành ngữ RAII?
Tôi không muốn sử dụng phương thức init()
để xây dựng hai giai đoạn. Điều duy nhất tôi có thể đưa ra là:
MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (const std::exception& e) { /* Handle constructor exception */ }
std::shared_ptr<MyClass> lMyObjectPtr(lMyObject);
lMyObjectPtr->DoSomething();
Hoạt động OK, nhưng tôi không hài lòng với con trỏ thô trong phạm vi và con trỏ. Đây có phải chỉ là một mụn cóc C++ khác không?
Chuyển cuộc gọi phương thức DoSomething() sang khối thử? – milleniumbug
** Không bao giờ ** bắt ngoại lệ bằng bản sao. Gắn bó với * tham chiếu liên tục *. –
Trong ví dụ thứ hai, nếu hàm tạo đã ném, 'lMyObject' là một con trỏ chưa được khởi tạo. – aschepler