Обработка ошибок и исключений
Win32 API обеспечивает полную поддержку обработки ошибок и исключений. Подобная возможность крайне важна для разработчиков, поскольку динамическая природа Windows способствует тому, что обычно успешные операции могут давать сбои в непредсказуемых обстоятельствах. Обработка ошибок и исключений повышает живучесть приложений, делая их менее чувствительными к постоянно изменяющемуся состоянию системы. Более того, при сбое системы становится возможным нормальный выход из приложения.
Создание обработчиков исключений и фильтров
В листинге 26.1 содержится пример кода, в котором предпринимается попытка защиты программы традиционным способом — выполнением операций и проверкой результатов. Код проверяет наличие нарушений протокола подпрограммы (неправильной передачи параметров), а также системных ошибок, наподобие перерасхода ресурсов. Чаще всего подобные ошибки не возникают, хотя потраченное на проверку параметров время может тысячекратно окупиться в течение времени жизни программы.
Листинг 26.1 Традиционное использование Windows API_______________________ См. \local-sources\chap04\t26-01. txt
Каждый раз перед выполнением основного кода происходит проверка параметров. Это снижает быстродействие программы, поскольку проверки должны выполняться при каждом взаимодействии пользователя с API. Ни одну из проверок из данного кода удалить не удастся.
Более совершенный метод заключается в использовании try-блоков. Они представляют собой механизм компилятора, допускающий попытку выполнения блока кода с восстановлением программы в случае возникновения ошибок. Текст программы становится более понятным, а эффективность работы повышается. Листинг 26.2 демонстрирует те же операции, что и листинг 26.1. Обратите внимание, что обработка исключений делает логику программы предельно непротиворечивой.
Листинг 26.2 Использование обработчиков исключений________________________
См. \local-sources\chap04\t26-02.txt
Для каждого блока try...except существует три компонента. Первый является самим try-блоком, который содержит ключевое слово try и выполняемый код. Затем следует блок фильтра исключения, включающий ключевое слово except и заключенный в скобки параметр. Фильтр исключения определяет действие системы на данном уровне каскада исключений. Значение EXCEPTION_EXECUTE_HANDLER (см. табл. 25.17 при описании функции SetUnhandledExceptionFilter) указывает, что блок после фильтра должен выполняться для любого исключения. Фильтр также применяется для выбора исключений, проходящих через обработчик.
Еще одной эффективной конструкцией служит оператор try...finally. Подобно оператору try...except, он начинается с блока try. Однако вместо использования фильтров и обработчиков исключений в блоке try...finally применяются обработчики завершения. Обработчик завершения представляет собой блок кода, который следует за ключевым словом finally. Когда исключение происходит (или какое-то условие приводит к выходу из блока try), выполняется код обработчика завершения. Подобно операторам try...except, операторы try...finally могут быть вложенными. Пример оператора try...finally будет показан при описании функции AbnormalTermination.
Win32 API для обработки исключений
В Win32 API определен набор функций, которые предоставляют дополнительную информацию об ошибках. Функция GetExceptionCode возвращает код текущего исключения. Она может вызываться только из фильтра исключения. Функцию GetExceptionCode можно применять для тестирования аппаратных и программных исключений (программные исключения могут устанавливаться через функцию RaiseException. как, собственно, упоминалось в главе 25).
В рамках обработчика исключений функция GetExceptionlnformation возвращает полный контекст системы, включая код обработки исключений. В рамках блока завершения, т.е. кода, следующего после ключевого слова finally, вызывается функция AbnormalTermination с целью определения, полностью ли выполнен try-блок. Abnormal-Termination не проверяет факт возникновения исключения, поскольку существуют другие способы выхода из блока try — операторы goto, return, leave и т.п.
Функция SetErrorMode позволяет изменять системный режим ошибок (system error mode). Системный режим ошибок управляет способом обработки системой определенных критических ошибок. Например, в случае ошибки это может использоваться для отображения связанного с приложением интерфейса отладки взамен обычного окна Unhandled Exception (Необрабатываемое исключение). Еще одна возможная цель изменения системного режима заключается в запрете вывода окна сообщения, которое появляется, если система не может обнаружить файл компонента. Подобное происходит в случаях, когда имеет место условное включение библиотеки DLL в приложение. Стандартное значение режима ошибок должноь восстанавливаться непосредственно после загрузки зависимого модуля.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.