Коды исключений

Коды исключений

Для точной идентификации типа возникшего исключения блок исключения или выражение фильтра могут использовать следующую функцию:

DWORD GetExceptionCode(VOID)

Код исключения должен быть получен сразу же после возникновения исключения. Поэтому функция фильтра не может просто вызвать функцию GetExceptionCode (это ограничение налагается компилятором). Обычный способ решения этой проблемы состоит в том, чтобы осуществить этот вызов в выражении фильтра, как показано в следующем примере, в котором код исключения является аргументом функции фильтра, предоставляемой пользователем:

__except(MyFilter(GetExceptionCode())) {

} 

В данном случае значение выражения фильтра, которое должно быть одним из трех указанных ранее значений, определяется и возвращается функцией фильтра. В свою очередь, для определения возвращаемого этой функцией значения используется код исключения; например, можно сделать так, чтобы фильтр передавал обработку исключений, возникающих при выполнении операций с плавающей точкой (FP-исключений, от FloatingPoint — плавающая точка), внешнему обработчику (возвращая значение EXCEPTION_CONTINUE_SEARCH), а обработку нарушений доступа к памяти — текущему обработчику (возвращая значение EXCEPTION_EXECUTE_HANDLER).

Число возможных кодов исключений, возвращаемых функцией GetExceptionCode, очень велико, однако их можно разделить на несколько категорий.

• Выполнение программой некорректных действий, например:

EXCEPTION_ACCESS_VIOLATION — попытка чтения или записи по адресу виртуальной памяти, к которой процесс не имеет доступа.

EXCEPTION_DATATYPE_MISALIGNMENT — многие процессоры, например, требуют чтобы данные типа DWORD выравнивались по четырехбайтовым границам.

EXCEPTION_NONCONTINUABLE_EXECUTION — значением выражения фильтра было EXCEPTION_CONTINUE_EXECUTION, но выполнения программы после возникновения исключения не может быть продолжено.

• Исключения, сгенерированные функциями распределения памяти НеарAlloc и HeapCreate, если они используют флаг HEAP_GENERATE_EXCEPTIONS (см. главу 5). Соответствующими значениями кода исключения являются STATUS_NO_MEMORY или EXCEPTION_ACCESS_VIOLATION.

• Коды определенных пользователем исключений, генерируемых путем вызова функции RaiseException, о чем говорится в подразделе "Исключения, генерируемые приложением".

• Коды различных арифметических исключений (особенно FP-исключений), например, EXCEPTION_INT_DIVIDE_BY_ZERO или EXCEPTION_FLT_OVERFLOW.

• Исключения, используемые отладчиками, например, EXCEPTION_BREAKPOINT или EXCEPTION_SINGLE_STEP.

Вам пригодится также функция GetExceptionInformation, которая может быть вызвана только из выражения фильтра и возвращает дополнительную информацию, включая информацию, специфическую для используемого процессора. 

LPEXCEPTION_POINTERS GetExceptionINFORMATION(VOID) 

Вся информация, как относящаяся, так и не относящаяся к процессору, содержится в структуре EXCEPTION_POINTERS, состоящей из двух других структур.  

typedef struct _EXCEPTION_POINTERS {

 PEXCEPTION_RECORD ExceptionRecord;

 PCONTEXT ContextRecord;

} EXCEPTION POINTERS; 

В структуру EXCEPTION_RECORD входит элемент ExceptionCode, набор возможных значений которого совпадает с набором значений, возвращаемых функцией GetExceptionCode. Элемент ExceptionFlags структуры EXCEPTION_RECORD может принимать значения 0 или EXCEPTION_NONCONTINUABLE, причем последнее значение указывает функции фильтра на то, что она не должна предпринимать попыток продолжения выполнения. К числу других элементов данных этой структуры относятся адрес виртуальной памяти ExceptionAddress и массив параметров ExceptionInformation. В случае исключения EXCEPTION_ACCESS_VIOLATION значение первого элемента этого массива указывает на то, какая именно из операций пыталась получить доступ по недоступному адресу — записи (1) или чтения (0). Второй элемент содержит адрес виртуальный памяти.

Во втором элементе структуры EXCEPTION_POINTERS, а именно, элементе ContextRecord, содержится информация, относящаяся к процессору. Для каждого типа процессоров предусмотрены свои структуры, определения которых содержатся в файле <winnt.h>.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Приложение B КОДЫ ВАЖНЫХ ТРАНЗАКЦИЙ

Из книги SAP R/3 Системное администрирование автора Хагеман Сигрид

Приложение B КОДЫ ВАЖНЫХ ТРАНЗАКЦИЙ В следующей таблице перечислены коды наиболее важных транзакций для системного администрирования R/3 Можно вводить коды транзакций R/3 в поле команды SAP GUI Доступны следующие параметры:? /n<код_транзакции>Выход из активной в данный


14.6.8 Коды ответов

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

14.6.8 Коды ответов Каждой команде в диалоге соответствует ответ, состоящий из кода ответа и сообщения. Например:ftp> get subnets--> PORT 128,36,0,22,10,54200 PORT command successful.--> RETR subnets150 Opening ASCII mode data connection for subnets (3113 bytes).226 Transfer complete.Коды ответов состоят из трех цифр, каждая из которых имеет


16.10 Коды ответов

Из книги Технология XSLT автора Валиков Алексей Николаевич

16.10 Коды ответов Коды ответов SMTP имеют структуру, подобную кодам ответов FTP. Код состоит из трех цифр. Первая цифра указывает статус команды: 1yz Положительный предварительный (Positive Preliminary) ответ (в настоящее время в SMTP не используется) 2yz Положительный дополненный (Positive


17.7.2 Коды состояния NNTP

Из книги Краткое введение в программирование на Bash автора Родригес Гарольд

17.7.2 Коды состояния NNTP В диалоге из раздела 17.5 видно, что каждый ответ сервера NNTP начинается с числового кода состояния. При этом используются одинаковые для серверов SMTP и FTP правила: 1xx Информационное сообщение 2xx Успешная команда 3xx Команда пока была успешна, нужно


19.8.3 Коды состояния

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

19.8.3 Коды состояния Коды состояния используются подобно электронной почте и пересылке файлов (FTP). Наиболее распространенные значения кодов: 1xx Информация. Не используется, но зарезервирован для применения в будущем. 2xx Успешно. Запрошенная операция была успешно


Коды завершения программ

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Коды завершения программ Большинство программ возвращают в операционную систему какое-то число, показывающее, насколько удачно программа завершила свою работу. Например, man-страница grep говорит, что grep вернет 0, если заданный шаблон найден, и 1, если совпадений не найдено.


Возвращаемые коды и ответная реакция

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Возвращаемые коды и ответная реакция Восстановление базы данных, выполняемое под Windows, возвращает код 0 при успешном завершении и 1 при ошибках. Если встретилась ошибка, посмотрите файл firebird.log (interbase.log в версии


Приложение 10. Коды ошибок

Из книги Домены. Все, что нужно знать о ключевом элементе Интернета автора Венедюхин Александр

Приложение 10. Коды ошибок Коды ошибок, возвращаемые клиентам или модулям PSQL сервером Firebird 1.5.0, представлены в табл. П10.1. Некоторые коды недоступны в более ранних версиях Firebird. Важно убедиться, что сервер и клиент имеют корректную версию файла firebird.msg (interbase.msg для Firebird 1.0.x),


Приложение Д Коды ошибок DOS

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Приложение Д Коды ошибок DOS 2 – файл не найден3 – путь доступа не найден5 – доступ отвергнут6 – недопустимая обработка8 – недостаточно памяти10 – недопустимая программная среда11 – неверный формат18 – файлы


2.1.5. Коды завершения программы

Из книги автора

2.1.5. Коды завершения программы Когда программа завершает работу, она уведомляет операционную систему о своем состоянии, посылая ей код завершения, который представляет собой 16-разрядное целое число. По существующему соглашению нулевой код свидетельствует об успешном


18.1. Коды завершения

Из книги автора

18.1. Коды завершения Перед тем как рассмотреть некоторые примеры удачных сценариев, посвятим несколько слов кодам завершения. Каждая выполняемая команда возвращает код завершения. Чтобы просмотреть его, достаточно воспользоваться кодом завершения последней команды:$ echo


Глава 6 Страны, коды и домены

Из книги автора

Глава 6 Страны, коды и домены Национальными доменами называют двухбуквенные домены первого уровня, соответствующие кодам, обозначающим государства. Например, домен RU – национальный домен России; домен DE – национальный домен Германии; UZ – национальный домен Узбекистана.