Cada vez que considero hacer que mi código sea totalmente seguro para las excepciones, justifico no hacerlo porque sería muy lento. Considere este fragmento relativamente simple:
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;
Para implementar una garantía de excepción básica, podría usar un puntero de alcance en las new
llamadas. Esto evitaría pérdidas de memoria si alguna de las llamadas arrojara una excepción.
Sin embargo, digamos que quiero implementar una garantía de excepción fuerte. Al menos, yo tendría que poner en práctica un puntero compartida por mis contenedores (no estoy usando Boost), un nothrow Entity::Swap
para añadir los componentes de forma atómica, y algún tipo de lenguaje para añadir atómicamente tanto a la Vector
y Map
. Implementarlos no solo llevaría mucho tiempo, sino que serían caros, ya que implica mucha más copia que la solución insegura de excepción.
En última instancia, me parece que el tiempo dedicado a hacer todo eso no estaría justificado solo para que la CreateEntity
función simple sea totalmente segura. Probablemente solo quiero que el juego muestre un error y se cierre en ese punto de todos modos.
¿Hasta dónde llevas esto en tus propios proyectos de juego? ¿Es generalmente aceptable escribir código inseguro de excepción para un programa que simplemente puede bloquearse cuando hay una excepción?