Отказоустойчивость и аккуратность кода
октября 8 2009 by admin in Обязательный материалСовременное ПО настолько сложно, что предугадать, в какой среде будет исполняться программа, невозможно. Под средой я подразумеваю содержимое адресного пространства, значения параметров функций и эффект, производимый другими процессами, исполняющимися в той же системе. Из-за этой сложности службы, функционирующие непрерывно несколько месяцев, обязаны быть отказоустойчивыми.
Как настойчиво внушали нам университетские профессора, что в программах необходимо применять корректные методы проверки и нейтрализации ошибок! Мы, разработчики, знаем, что нужно писать устойчивый к ошибкам код, но часто такая скрупулезность кажется скучной, и мы этим пренебрегаем. Мы слишком благодушны, считая, что «ОС сама о нас позаботится». Многие разработчики действительно думают, что память бесконечна, а ресурсы можно использовать неограниченно, так как они знают, что система автоматически все вычистит, когда процесс «умрет».
Многие приложения и впрямь реализованы именно так, причем результаты не столь и плохи — ведь приложения обычно работают недолго, а потом перезапускаются. Однако службы выполняются непрерывно, поэтому если разработчик не предусмотрел в свое время надлежащую нейтрализацию ошибок и освобождение ресурсов, то для службы это может оказаться гибельным.
По-моему, только используя обработку исключительных ситуаций, удастся заставить приложение работать 24 часа в сутки, семь дней в неделю. Поэтому я настоятельно рекомендую ознакомиться с методами обработки исключений. Их всего два: структурная обработка исключений — механизм, предлагаемый ОС Windows, и обработка исключений C++, предлагаемая компилятором. И тот и другой позволяют писать код, способный восстанавливать работу при непредвиденных сбоях и жестких ошибках, таких как нарушение доступа, деление на 0 и переполнение стека.
Эти механизмы полезны в различных сценариях, и, к счастью, Microsoft Visual C++ позволяет применять оба в одном приложении. Примеры этой книги демонстрируют концепции создания надежных серверных приложений, и во многих из них активно применяется обработка исключений. Если вы хотите изучить обработку исключений основательнее, обратитесь к книге Джеффри Рихтера «Windows для профессионалов» (см. стр. ??).
Правильное использование C++ здорово облегчит вашу программистскую долю. Я пришел к выводу, что заключение простых объектов Windows в оболочки классов C++ полезно по многим причинам (о них чуть ниже). Поэтому в большинстве примеров, приведенных в этой книге, применяются классы C++.