Каждый раз, когда я решаю сделать свой код безопасным для исключений, я оправдываю это не делать, потому что это отнимает много времени. Рассмотрим этот относительно простой фрагмент:
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;
Чтобы реализовать базовую гарантию исключений, я мог бы использовать ограниченный указатель на new
вызовы. Это предотвратит утечки памяти, если любой из вызовов вызовет исключение.
Однако, скажем, я хочу реализовать строгую исключительную гарантию. По крайней мере, мне нужно было бы реализовать общий указатель для моих контейнеров (я не использую Boost), nothrow Entity::Swap
для атомного добавления компонентов и какую-то идиому для атомарного добавления к обоим Vector
и Map
. Это не только потребует много времени для реализации, но и будет дорогостоящим, поскольку требует гораздо большего копирования, чем небезопасное исключительное решение.
В конечном счете, мне кажется, что время, потраченное на выполнение всего этого, было бы неоправданным, так что простая CreateEntity
функция строго безопасна для исключений. Я, вероятно, просто хочу, чтобы игра все равно отображала ошибку и закрывалась в этот момент.
Как далеко вы берете это в своих собственных игровых проектах? Обычно допустимо писать небезопасный код исключения для программы, которая может просто аварийно завершить работу при наличии исключения?