/* Конец основного цикла обработки файлов и блока try. */
/* Обработчик исключений для тела цикла. */
__except(EXCEPTION_EXECUTE_HANDLER) {
_tprintf(_T("Ошибка при обработке файла %s\n"), argv[iFile]);
DeleteFile (OutFileName);
}
_tprintf(_T("Обработаны все файлы, кроме указанных выше \n"));
return 0;
}
Пример:
использование функции фильтра
Программа 4.3 представляет собой каркас программы, иллюстрирующей обработку исключений и завершения выполнения, в которой используется функция фильтра. Программа предлагает пользователю указать тип исключения, после чего продолжает работу для генерации исключения. Функция фильтра обрабатывает различные типы исключений по-разному; выбор вариантов, предусмотренных в программе, был совершенно произвольным и определялся исключительно целями демонстрации. В частности, программа обнаруживает попытки обращения к недоступным областям памяти, предоставляя адреса виртуальной памяти, по которым производилось такое обращение.
Блок __finally восстанавливает состояние маски FP-исключений. Совершенно очевидно, что восстановление состояния маски в данном случае, когда процесс уже должен завершаться, особого значения не имеет, но эта методика пригодится нам впоследствии, когда мы будем использовать ее на стадии завершения выполнения потока. Вообще говоря, процесс должен восстанавливать и системные ресурсы, например, удалять временные файлы, освобождать ресурсы синхронизации (глава 8) и отменять блокирование файлов (главы 3 и 6). Функция фильтра представлена в программе 4.4.
Данный пример не иллюстрирует обработку исключений, которые могут возникать при распределении памяти; эти исключения мы начнем интенсивно использовать в главе 5.
Программа 4.3. Exception: обработка исключений и завершения выполнения
#include "EvryThng.h"
#include <float.h>
DWORD Filter(LPEXCEPTION_POINTERS, LPDWORD);
double x = 1.0, у = 0.0;
int _tmain(int argc, LPTSTR argv[]) {
DWORD ECatgry, i = 0, ix, iy = 0;
LPDWORD pNull = NULL;
BOOL Done = FALSE;
DWORD FPOld, FPNew;
FPOld = _controlfp(0, 0); /* Сохранить старую управляющую маску. */