Giả sử tôi xây dựng đối tượng RAII và đối tượng đó có thể không xây dựng được. Làm cách nào để xử lý việc này?Khi đối tượng RAII không thể xây dựng
try {
std::vector<int> v(LOTS);
// try scope ends here because that's what the catch is for
} catch(const std::bad_alloc&) {
// ...
}
// v? what v?
Đã cấp, hàm tạo mặc định là std::vector
sẽ không ném và có thể giúp, nhưng đây không phải là trường hợp chung. Một nhà xây dựng có thể ném rất tốt. Nếu tôi muốn xử lý bất kỳ lỗi mua lại tài nguyên nào, làm cách nào để thực hiện điều đó trong khi vẫn có thể tiếp tục nếu nó không ném?
Chỉnh sửa: Để làm rõ, vấn đề của tôi là nếu tài nguyên không đạt được thì tôi có thể muốn thử lại, v.v. Có lẽ tôi có thể thử mua một nguồn tài nguyên thay thế.
Không chính xác câu hỏi là gì. Mã sử dụng v phải nằm trong khối thử. – Dialecticus
Khi tôi hiểu câu hỏi, vấn đề là để có thể phục hồi từ một ngoại lệ trong hàm tạo 'v',' v' phải được khai báo bên trong phạm vi 'try', có nghĩa là nó không còn có thể là hiển thị * sau * khối 'catch'. Vì vậy, nếu bạn có mã mà một mặt cần có khả năng "bỏ qua" một ngoại lệ khi xây dựng 'v', và mặt khác, có thể sử dụng' v' nếu xây dựng thành công, nó sẽ hơi phức tạp một chút – jalf
Nếu một tài nguyên thất bại để có được sau đó có lẽ tôi có thể làm với một nguồn tài nguyên thay vì, thay vì để cho các ngoại lệ tuyên truyền. Và nếu tài nguyên thứ hai đó thất bại thì có lẽ tôi có một ý tưởng khác, v.v. Tôi cảm thấy như thế này dẫn đến một mớ hỗn độn trong mã không có vấn đề gì tôi tiếp cận. RAII chỉ mô tả làm thế nào để làm sạch trong trường hợp thất bại, không phải làm thế nào để giải quyết thất bại. – wilhelmtell