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