Составители:
граммирования может сильно различаться синтаксис операторов обработки исключений.
Термин структурированная обработка исключений подразумевает, что язык содержит
определенную управляющую структуру, связанную с исключениями.
Программисты, впервые столкнувшиеся с проблемой структурированной обработ-
ки исключений, часто ошибочно полагают, что больше нет необходимости проверять
код завершения каждой команды. На самом деле, ошибка - это далеко не то же самое,
что исключение. Функция может завершиться без генерации исключения. Рассмотрим в
качестве примера следующие строки программного кода, реализованного на API-
функциях для ОС Windows:
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, 1000 );
pData = (char *)GlobalLock( hMemory );
В случае возникновения ошибки, связанной с выделением памяти, переменная
hMemory принимает значение NULL, функция GlobalLock() не выполняется и перемен-
ная pData также получает значение NULL. Однако ни одна из этих ошибок не порождает
исключения. Но следующая строка программного кода при попытке произвести запись
по неправильному адресу генерирует исключение:
pData[0] = "а"; // порождает исключение, если pData = NULL
Исключение представляет собой разновидность ошибки, которая не может быть
обработана самой командой. Если функция GlobalAlloc не обнаруживает достаточно
места, для своего выполнения, она просто возвращает значение NULL. Но если операто-
ру присваивания некуда передавать значение, он не выполняет никаких действий и даже
не возвращает код ошибки. При этом порождается исключение, и если процесс не может
его обработать, операционная система должна закрыть данный процесс.
Часто бывает трудно провести черту между ошибками и исключениями. Различие
между ними порой зависит от конкретной реализации. Для того чтобы распознавать ко-
манды, которые могут порождать исключения, необходимо иметь некоторый опыт. Вы
должны знать всевозможные типы исключений и быть в состоянии определить, какие
операции могут их породить. Например, ошибка в операторе присваивания приводит к
исключению типа нарушение прав доступа. Список возможных исключений обычно
изменяется в зависимости от конкретною компьютера, однако имеется ряд исключений,
которые определяются на уровне ядра Windows [12]:
• несоответствие типов данных (data-type misalignment);
• прерывание отладчика (debugger breakpoint);
• пошаговая отладка (debugger single-step);
• деление на ноль в операции с плавающей запятой (floating-point divide by zero);
86
граммирования может сильно различаться синтаксис операторов обработки исключений.
Термин структурированная обработка исключений подразумевает, что язык содержит
определенную управляющую структуру, связанную с исключениями.
Программисты, впервые столкнувшиеся с проблемой структурированной обработ-
ки исключений, часто ошибочно полагают, что больше нет необходимости проверять
код завершения каждой команды. На самом деле, ошибка - это далеко не то же самое,
что исключение. Функция может завершиться без генерации исключения. Рассмотрим в
качестве примера следующие строки программного кода, реализованного на API-
функциях для ОС Windows:
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, 1000 );
pData = (char *)GlobalLock( hMemory );
В случае возникновения ошибки, связанной с выделением памяти, переменная
hMemory принимает значение NULL, функция GlobalLock() не выполняется и перемен-
ная pData также получает значение NULL. Однако ни одна из этих ошибок не порождает
исключения. Но следующая строка программного кода при попытке произвести запись
по неправильному адресу генерирует исключение:
pData[0] = "а"; // порождает исключение, если pData = NULL
Исключение представляет собой разновидность ошибки, которая не может быть
обработана самой командой. Если функция GlobalAlloc не обнаруживает достаточно
места, для своего выполнения, она просто возвращает значение NULL. Но если операто-
ру присваивания некуда передавать значение, он не выполняет никаких действий и даже
не возвращает код ошибки. При этом порождается исключение, и если процесс не может
его обработать, операционная система должна закрыть данный процесс.
Часто бывает трудно провести черту между ошибками и исключениями. Различие
между ними порой зависит от конкретной реализации. Для того чтобы распознавать ко-
манды, которые могут порождать исключения, необходимо иметь некоторый опыт. Вы
должны знать всевозможные типы исключений и быть в состоянии определить, какие
операции могут их породить. Например, ошибка в операторе присваивания приводит к
исключению типа нарушение прав доступа. Список возможных исключений обычно
изменяется в зависимости от конкретною компьютера, однако имеется ряд исключений,
которые определяются на уровне ядра Windows [12]:
• несоответствие типов данных (data-type misalignment);
• прерывание отладчика (debugger breakpoint);
• пошаговая отладка (debugger single-step);
• деление на ноль в операции с плавающей запятой (floating-point divide by zero);
86
Страницы
- « первая
- ‹ предыдущая
- …
- 82
- 83
- 84
- 85
- 86
- …
- следующая ›
- последняя »
