Я пишу реактивное программное обеспечение, которое многократно получает ввод, обрабатывает его и выдает соответствующий вывод. Основной цикл выглядит примерно так:
initialize();
while (true) {
Message msg,out;
recieve(msg);
process(msg,out);
//no global state is saved between loop iterations!
send(out);
}
Я хочу, чтобы любая ошибка, возникшая на этапе обработки, независимо от того, есть ли в ней ошибка памяти, логическая ошибка, неверное утверждение и т. Д., Программа очистит все, что сделала, и продолжит работу. Я предполагаю, что это неверный ввод, и просто проигнорирую его.
Исключение C ++ исключительно подходит для этой ситуации, я мог бы окружить process
предложением try/catch
и генерировать исключение всякий раз, когда что-то выходит из строя. Единственное, что мне нужно, чтобы убедиться, что я очистил все свои ресурсы, прежде чем выдать исключение. Это можно проверить с помощью RAII или путем написания глобального распределителя ресурсов (например, если ваш деструктор может вызвать исключение) и использовать его исключительно для всех ресурсов.
Socket s = GlobalResourceHandler.manageSocket(new Socket());
...
try {
process(msg,out);
catch (...) {
GlobalResourceHandler.cleanUp();
}
Однако использование исключений запрещено в нашем стандарте кодирования (также в стандарте Google C ++ BTW), в результате весь код компилируется с отключенными исключениями, и я полагаю, что никто не собирается менять то, как все работа только для моей проблемы дизайна.
Кроме того, это код для встраиваемой платформы, поэтому чем меньше мы используем дополнительной функции C ++, тем быстрее становится код и тем более он переносим.
Есть ли альтернативный дизайн, который я могу рассмотреть?
обновление:
Я ценю каждый ответ о стандарте идиотского кода. Единственное, что я могу сказать, это то, что в больших организациях вы должны иметь строгие, а иногда и нелогичные правила, чтобы быть уверенным, что ни один идиот не придет и не сделает ваш хороший код неприемлемым. Стандарт больше о людях, чем о технических деталях. Да, плохой человек может сделать каждый код беспорядочным, но гораздо хуже, если вы дадите ему дополнительные инструменты для этой задачи.
Я все еще ищу технический ответ.