Jedes Mal, wenn ich in Betracht ziehe, meinen Code ausnahmesicher zu machen, rechtfertige ich dies, weil es so zeitaufwendig wäre. Betrachten Sie dieses relativ einfache Snippet:
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;
Um eine grundlegende Ausnahmegarantie zu implementieren, könnte ich einen Bereichszeiger für die new
Aufrufe verwenden. Dies würde Speicherverluste verhindern, wenn einer der Aufrufe eine Ausnahme auslösen würde.
Nehmen wir jedoch an, ich möchte eine starke Ausnahmegarantie implementieren. Zumindest müsste ich einen gemeinsamen Zeiger für meine Container implementieren (ich verwende Boost nicht), einen Nothrow Entity::Swap
für das atomare Hinzufügen der Komponenten und eine Art Idiom für das atomare Hinzufügen von sowohl dem Vector
als auch Map
. Diese wären nicht nur zeitaufwändig in der Implementierung, sondern auch teuer, da sie viel mehr Kopien erfordern als die unsichere Ausnahmelösung.
Letztendlich fühlt es sich für mich so an, als wäre die Zeit, die ich damit verbringe, nicht gerechtfertigt, nur damit eine einfache CreateEntity
Funktion absolut ausnahmesicher ist. Ich möchte wahrscheinlich nur, dass das Spiel einen Fehler anzeigt und an diesem Punkt trotzdem geschlossen wird.
Wie weit gehen Sie in Ihren eigenen Spielprojekten? Ist es im Allgemeinen akzeptabel, unsicheren Ausnahmecode für ein Programm zu schreiben, das bei einer Ausnahme einfach abstürzen kann?