Обработка ошибок и исключений. Создание обработчиков исключений и фильтров, страница 2

Описания функций обработки ошибок и исключений

В табл. 26.1 перечисляются функции Windows API, связанные с обработкой ошибок и исключений. Затем следуют полные описания функций.

Таблица 26.1 Список функций обработки ошибок и исключений____________________

Функция

Описание

 

AbnormalTermination

Определяет, завершено ли выполнение предыдущего try-блока

 

Веер

Воспроизводит стандартный звуковой сигнал

 

GetExceptionCode

Определяет код исключения в функции фильтра

 

GetExceptionlnformation

Извлекает информацию о контексте процессора и памяти, когда возникает исключение

 

Функция

Описание

 

GetLastError

Возвращает код ошибки из локальной области хранения потока

 

SetErrorMode

Изменяет режим выявления ошибок системой

 

SefLastError

Устанавливает код ошибки локальной области хранения потока

 

SetLastErrorEx

Устанавливает код и категорию ошибки в локальной области хранения потока

 

AbnormalTermination                   • Windows 98   • Windows 2000

Описание

AbnormalTermination указывает, нормально ли завершен try-блок оператора try.. -finally. Эта функция может вызываться только из блока finally оператора try.. .finally, try-блок завершается нормально только в случае, когда выход из него осуществляется непосредственно после выполнения последнего оператора блока. Реализующие выход из блока операторы, такие как return, goto, continue и break, вызывают аварийное завершение блока (т.е. abnormal termination). Аварийное завершение try-блока может привести к тому, что система будет вести обратный поиск во всех фреймах стека для определения необходимости вызова обработчиков завершения. Это может снизить эффективность программы. Поэтому следует избегать аварийных завершений в try-блоках.

Синтаксис

BOOL AbnormalTermination( VOID )

Параметры

Функция не имеет параметров.

Возвращаемое значение

BOOL: Если try-блок завершен аварийно, возвращается значение TRUE, в противном случае — FALSE.

Включаемый файл

excpt.h

См. также

GetExceptionCode, GetExceptionlnformation

Пример

Следующий пример демонстрирует, перехват исключении в системе, а также получение информации о состоянии системы. Когда пользователь выбирает в примере пункт меню Test!, возбуждается программное, а затем аппаратное исключение. Исключения обнаруживаются, соответственно, обработчиком   исключений   и   обработчиком   завершения.   Функция AbnormalTermination используется в обработчике завершения для предупреждения пользователя о том, что текущая операция не может быть нормально завершена.

См.    \local-sources\chap26\26-01.txt

Веер                                                • Windows 98   • Windows 2000

Описание

Функция Веер описана в Win32 API для воспроизведения сигналов динамика определенной частоты и продолжительности. В Windows 95 Веер воспроизводит только стандартный звуковой сигнал.

Синтаксис

BOOL Beep( DWORD dwFreq, DWORD dwDuration )

Параметры

dwFreq

DWORD: Частота звука, выраженная в герцах, или циклах в секунду. Допустимый диапазон составляет от 37 до 32767 (от 0x25 до Ox7fff). В Windows 9х этот параметр игнорируется.

dwDuration

DWORD: Продолжительность в миллисекундах. Если параметр dwDuration имеет значение -1, звук воспроизводится до тех пор, пока сигнал динамика не будет перепрограммирован. В Windows 9x этот параметр игнорируется.

 

Возвращаемое значение

BOOL: При успешном выполнении возвращается TRUE, в противном случае — FALSE. Для возврата кода ошибки используется функция GetLastError.

 

Включаемый файл

winbase.h

 

См. также

GetLastError

 

Пример

См. пример приведенный в описании функции AbnormalTermination.

 

GetExceptionCode                       •  Windows 98   • Windows 2000

 

Описание

Функция GetExceptionCode извлекает код, который идентифицирует тип возникшего исключения. Приложение может вызывать эту функцию из выражения фильтра либо блока обработчика исключений try.. .except.

 

Синтаксис

DWORD GetExceptionCode( VOID )

 

Параметры

Функция не содержит параметров.

 

Возвращаемое значение

DWORD: Тип возвращаемого исключения. В табл. 26.2 перечислены типичные аппаратные исключения. Кроме того, функция GetExceptionCode выявляет программные исключения, сгенерированные RaiseException (об этом речь шла в главе 25).

 

Таблица 26.2 Стандартные аппаратные исключения

 

Константа кола исключения

Описание

 

STATUS_ACCESS_VIOLATION

Попытка чтения или записи по недоступному адресу памяти. Кроме того, это может быть попытка обработки данных или записи в кодовую страницу с недопустимым селектором.

 

STATUS_BREAKPOINT

Аппаратно задаваемая точка останова (только для отладчиков).

 

STATUS_FLOATING_DIVIDE_BY_ZERO

Происходит при попытке деления значения с плавающей точкой (float) на 0.0.

 

STATUS_FLOATING_OVERFLOW

Происходит при переполнении положительного значения экспоненты значения с плавающей точкой.

 

STATUS_FLOATING_UNDERFLOW

Происходит при переполнении отрицательного значения экспоненты значения с плавающей точкой.

 

STATUSJLLEGALJNSTRUCTION

Выполнение недопустимой команды.

 

STATUS_INTEGER_DIVIDE_BY_ZERO

Деление целого значения на ноль.

 

STATUS_INTEGER_OVERFLOW

Происходит, когда превышается диапазон целого значения.

 

STATUS_PRIVILEGED_INSTRUCTION

Выполнение приоритетной команды вне кода Ring-0 (нулевого кольца защиты).

 

STATUS_SINGLE_STEP

Выполнение единственного шага (только для отладчиков).

 

Включаемый файл

excpt.h

 

См. также

RaiseException, GetExceptionlnformation, UnhandledExceptionFilter, SetLJnhandledExceptioii Filter

 

Пример

См. пример, приведенный в описании функции AbnornialTerniinatioa

 

GetExceptionlnformation                • Windows 98   • Windows 2000

 

Описание

Функция GetExceptionlnformation возвращает указатели на структуры, описывающие состояние системы и выполняемого потока во время, когда произошло исключение. Приложение может вызывать эту функцию только из выражения фильтра обработчика исключений try.. .except.

 

Синтаксис

LPEXCEPTION_POINTERS GetExceptionInformation( VOID )

 

Параметры

Функция не имеет параметров.

 

Возвращаемое значение

LPEXCEPTION_POINTERS: Указатель на структуру EXCEPTION_POINTERS, которая содержит указатель на структуру CONTEXT, описывающую систему на момент исключения, а также указатель на структуру EXCEPTION_RECORD, описывающую условия исключения. Описания структур EXCEPTION_RECORD и EXCEPTION_POINTERS приводятся ниже. Структура CONTEXT представляет собой данные регистров процессора. Описание этой структуры содержится в файле заголовков WINNT.H.

 

Включаемый файл

excpt.h

 

См. также

GetExceptionCode, UnhandledExceptionFilter, SetUnhandledExceptionFilter

 

Описание струк туры EXCEPTION_POINTERS

typedef struct _EXCEPTION_POINTERS

{ PEXCEPTION_RECORD ExceptionRecord ; PCONTEXT ContextRecord; }    EXCEPTION_POINTERS ,    *LPEXCEPTION_POINTERS

 

Члены

 

ExceptionRecord

PEXCEPTION_RECORu: указатель на структуру EXCEPTION_RECORD. Описание этой структуры приводится ниже.

 

ContextRecord

PCONTEXT: Указатель на структуру CONTEXT. Ее описание содержится в файле заголовков WINNT.H.

 

Описание струк туры EXCEPTION_RECORD

typedef struct    EXCEPTION RECORD { DWORD ExceptionCode ; DWORD ExceptionFlags ; struct _EXCEPTION_RECORD *ExceptiOBft*COrd; PVOID ExceptionAddress; DWORD NumberParameters ; UINT PTR Exceptionlnf ormation [EXCEPTION_MAXIMUM_PMWMETERS] ; }   EXCEPTION_RECORD,   *PEXCEPTION_RECORD;

 

Члены

 

ExceptionCode

DWORD: Причина исключения. Это код, сгенерированный аппаратным исключением, либо код, указанный в функции RaiseException для программно сгенерированного исключения.

 

Exception Flags

DWORD: Флаги исключения. Этот член может принимать 0, указывающий на продолжаемое исключение, либо значение EXCEPTIONJ4ONCON-TINUABLE, указывающее на непродолжаемое исключение.

 

ExceptionRecord

EXCEPTION_RECORD*: Указатель на связанную структуру EXCEPTION_RECORD. Возможно последовательное расположение записей исключений для предоставления дополнительной информации, когда происходят вложенные исключения.

 

ExceptionAddress

PVOID: Адрес, где произошло исключение.

 
 

NumberParameters

DWORD: Количество параметров, связанных с исключением. Совпадает с количеством элементов, описанных в массиве Exception Information.

 
 

ExceptionInformation

UINT_PTR[EXCEPTION_MAXIMUM_PARAMETERS]: Массив дополнительных 32-разрядных аргументов, описывающих исключение. Этот массив аргументов определять функция RaiseException может.

 

Пример

См. пример, приведенный в описании функции AbnormalTermination.

 

GetLastError            • Windows 98   • Windows 2000

 

Описание

Функция GetLastError возвращает последнюю ошибку, установленную системой в локальной области хранения потока. Функция зависит от потока. Это означает, что ошибки не распространяются между потоками процесса. GetLastError следует вызывать непосредственно после того, как значение возврата функции укажет, что такой вызов сгенерирует важные данные. По этой причине некоторые функции вызывают SetLastError(O) при успешном выполнении, удаляя код ошибки, сгенерированный последней функцией, выдавшей сбой. Большинство функций Win32 API, устанавливающих код последней ошибки потока, осуществляют эту операцию при сбоях. Для определения кода возврата, указывающего на сбой, следует обратиться к документации по данной функции.

 

Синтаксис

DWORD GetLastError( VOID )

 

Параметры

Функция не имеет параметров.

 

Возвращаемое значение

DWORD: Код последней ошибки для вызывающего потока, установленный SetLastError.

 

Включаемый файл

winbase.h

 

См. также

SetLastError, SetLastErrorEx

 

Пример

Следующий пример демонстрирует создание функции, которая устанавливает собственную ошибку через SetLastError 'и извлекает код ошибки после того, как функция генерирует возврат при помощи GetLastError.

 

См.    \local-sources \chap26\26-02 . txt

 

SetErrorMode               •  Windows 98   • Windows 2000

 

Описание

Функция SetErrorMode изменяет поведение системы при обработке определенных условий ошибок. При этом дочерние процессы наследуют режим родительского процесса.

 

Синтаксис

UINT SetErrorMode( UINT uNewErrorMode )

 

Параметры

,-.-:.            -

 

uNewErrorMode

UINT: Вновь устанавливаемый режим обработки ошибок. Список значений этого параметра приводится в табл. 26.3.

 

Таблица 26.3 Значения параметра uNewErrorMode функции SetErrorMode

 

Режим ошибок

Описание

 

0

Устанавливается в системе по умолчанию. Отображаются все диалоговые окна сообщений об ошибках.

 

SEM FAILCRITICALERRORS

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

 

SEM_NOALIGNMENTFAULTEXCEPT

Указывает, что для определенных процессоров Windows автоматически исправляет ошибки распределения памяти и скрывает их.

 

SEM_NOGPFAULTERRORBOX

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

 

SEM_NOOPENFILEERRORBOX

Отключает окно сообщений, отображаемое в случае невозможности нахождения файла. Ошибка возвращается вызывающему процессу.

 

Возвращаемое значение UINT: Предыдущий режим.

 

Включаемый файл

winbase.h

 

См. также

SetUnhandledExceptionFilter, UnhandledExceptionFilter

 

SetLastError                               • Windows 98   • Windows 2000

 

Описание

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

 

Синтаксис   ,

VOID SetLastError( DWORD dwErrorCode )

 

Параметры

 

dwErrorCode

DWORD: Устанавливаемый код ошибки. Разряд 29 зарезервирован для определяемых приложением кодов ошибок, которые не конфликтуют с системными кодами ошибок.

 

Включаемый файл

winbase.h

 

См. также

SetLastErrorEx

 

Пример

Пример содержится в описании функции GetLastError.

 

SetLastErrorEx                            • Windows 98   • Windows 2000

 

Описание

Функция SetLastErrorEx устанавливает код последней ошибки. Она идентична функции SetLastError. Второй параметр в настоящее время не реализован.

 

Синтаксис

VOID SetLastErrorEx( DWORD dwErrorCode, DWORD dwErrorType )

 

Параметры

 

dwErrorCode

DWORD: Устанавливаемый код ошибки. Разряд 29 зарезервирован для определяемых приложением кодов ошибок, которые не конфликтуют с системными кодами ошибок.

 

dwErrorType

DWORD: Тип ошибки. Если процесс находится в состоянии отладки, отладчик может предпринять определенные действия в зависимости от типа ошибки. Если параметр не равен 0, может принимать любое из перечисленных в табл. 26.4 значений.

 

Таблица 26.4 Значения параметра dwErrorType функции SetLastErrorEx

 

Тип ошибки

Описание

 

SLE_ERROR

Функция приняла недопустимые данные и ее выполнение невозможно.

 

SLE_MINORERROR

Функция приняла недопустимые данные и выполнение восстановлено.

 

SLE_WARNING

Функция приняла потенциально ошибочные данные, но ее выполнение восстановлено.

 

Включаемый файл

winbase.h

 

См. также

GetLastError, SetLastError