Mỗi lần tôi cân nhắc việc làm cho mã của mình trở nên ngoại lệ an toàn, tôi biện minh là không làm điều đó bởi vì nó sẽ rất tốn thời gian. Hãy xem xét đoạn trích tương đối đơn giản này:
Level::Entity* entity = new Level::Entity();
entity->id = GetNextId();
entity->AddComponent(new Component::Position(x, y));
entity->AddComponent(new Component::Movement());
entity->AddComponent(new Component::Render());
allEntities.push_back(entity); // std::vector
entityById[entity->id] = entity; // std::map
return entity;
Để thực hiện bảo đảm ngoại lệ cơ bản, tôi có thể sử dụng một con trỏ có phạm vi trong các new
cuộc gọi. Điều này sẽ ngăn rò rỉ bộ nhớ nếu bất kỳ cuộc gọi nào được đưa ra một ngoại lệ.
Tuy nhiên, giả sử tôi muốn thực hiện một đảm bảo ngoại lệ mạnh mẽ. Ít nhất, tôi sẽ cần phải thực hiện một con trỏ dùng chung cho các thùng chứa của mình (tôi không sử dụng Boost), một Entity::Swap
cách không cần thiết để thêm các thành phần nguyên tử và một số thành ngữ để thêm nguyên tử vào cả Vector
và Map
. Những điều này không chỉ tốn thời gian để thực hiện mà còn tốn kém vì nó liên quan đến việc sao chép nhiều hơn so với giải pháp không an toàn ngoại lệ.
Cuối cùng, tôi cảm thấy như thời gian dành cho việc đó sẽ không được biện minh chỉ để một CreateEntity
chức năng đơn giản là ngoại lệ an toàn. Tôi có lẽ chỉ muốn trò chơi hiển thị một lỗi và đóng tại thời điểm đó.
Làm thế nào đến nay bạn có điều này trong các dự án trò chơi của riêng bạn? Nói chung có thể chấp nhận viết mã không an toàn ngoại lệ cho một chương trình có thể bị sập khi có ngoại lệ không?