Составители:
Рубрика:
щаемого блока, управление передается фильтрующему выражению. Последнее
обычно определяет тип исключения и принимает решение о том, как продол-
жать его обработку. Исключения, прошедшие через фильтр, поступают в под-
программу-обработчик. Если фильтр блокирует исключение, подпрограмма-
обработчик не вызывается, и система продолжает поиск процедуры, которая
возьмет на себя обработку этого исключения.
Фильтрующее выражение может быть достаточно сложным. При необхо-
димости оно может даже вызывать отдельную функцию. Иногда фильтр сам
выполняет обработку исключения, вследствие чего блок catch остается пус-
тым. Во многих случаях для обработки исключительных ситуаций применяют-
ся MFC-класс CException и производные от него классы.
Программисты, впервые столкнувшиеся с проблемой структурированной
обработки исключений, часто ошибочно полагают, что больше нет необходи-
мости проверять код завершения каждой команды. В самом деле, ошибка – это
далеко не то же самое, что исключение. Функция может завершиться без гене-
рации исключения. Рассмотрим в качестве примера следующие строки про-
граммного кода:
hBrush = CreateSolidBrush (RGB(255; 0; 0)) ;
hOldBrush = SelectObject (hDC, hBrush);
Rectangle (hDC, 0, 0, 100, 100);…
Если первая команда выполняется некорректно и возвращает для созда-
ваемой кисти значение NULL,
то функция SelectObject() также не может быть
выполнена. Третья команда все же рисует прямоугольник, однако закрашивает
его не тем цветом, который нужен. Исключения при этом не генерируются.
Единственный способ защиты от подобных ошибок заключается в проверке
возвращаемого значения. Вот еще один пример:
HANDLE hMemory;
char *pData;
hMemory = GlobalAlloc (GHND, 1 000);
pData = (char *) GlobalLock (hMemory);…
В случае возникновения ошибки, связанной с выделением памяти, пере-
менная hMemory принимает значение NULL; функция GlobalLock() не выпол-
няется, и переменная pData также получает значение NULL.
Однако ни одна из
этих ошибок не порождает исключения. Но следующая строка программного
кода при попытке произвести запись по неправильному адресу генерирует ис-
ключение:
pData[0] = "а"; // порождает исключение, если pData = NULL.
Исключение представляет собой разновидность ошибки, которая не мо-
жет быть обработана самой командой. Если функция GlobalAlloc() не обнару-
живает достаточного места для своего выполнения, она просто возвращает
109
щаемого блока, управление передается фильтрующему выражению. Последнее
обычно определяет тип исключения и принимает решение о том, как продол-
жать его обработку. Исключения, прошедшие через фильтр, поступают в под-
программу-обработчик. Если фильтр блокирует исключение, подпрограмма-
обработчик не вызывается, и система продолжает поиск процедуры, которая
возьмет на себя обработку этого исключения.
Фильтрующее выражение может быть достаточно сложным. При необхо-
димости оно может даже вызывать отдельную функцию. Иногда фильтр сам
выполняет обработку исключения, вследствие чего блок catch остается пус-
тым. Во многих случаях для обработки исключительных ситуаций применяют-
ся MFC-класс CException и производные от него классы.
Программисты, впервые столкнувшиеся с проблемой структурированной
обработки исключений, часто ошибочно полагают, что больше нет необходи-
мости проверять код завершения каждой команды. В самом деле, ошибка – это
далеко не то же самое, что исключение. Функция может завершиться без гене-
рации исключения. Рассмотрим в качестве примера следующие строки про-
граммного кода:
hBrush = CreateSolidBrush (RGB(255; 0; 0)) ;
hOldBrush = SelectObject (hDC, hBrush);
Rectangle (hDC, 0, 0, 100, 100);…
Если первая команда выполняется некорректно и возвращает для созда-
ваемой кисти значение NULL, то функция SelectObject() также не может быть
выполнена. Третья команда все же рисует прямоугольник, однако закрашивает
его не тем цветом, который нужен. Исключения при этом не генерируются.
Единственный способ защиты от подобных ошибок заключается в проверке
возвращаемого значения. Вот еще один пример:
HANDLE hMemory;
char *pData;
hMemory = GlobalAlloc (GHND, 1 000);
pData = (char *) GlobalLock (hMemory);…
В случае возникновения ошибки, связанной с выделением памяти, пере-
менная hMemory принимает значение NULL; функция GlobalLock() не выпол-
няется, и переменная pData также получает значение NULL. Однако ни одна из
этих ошибок не порождает исключения. Но следующая строка программного
кода при попытке произвести запись по неправильному адресу генерирует ис-
ключение:
pData[0] = "а"; // порождает исключение, если pData = NULL.
Исключение представляет собой разновидность ошибки, которая не мо-
жет быть обработана самой командой. Если функция GlobalAlloc() не обнару-
живает достаточного места для своего выполнения, она просто возвращает
109
Страницы
- « первая
- ‹ предыдущая
- …
- 107
- 108
- 109
- 110
- 111
- …
- следующая ›
- последняя »
