Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 69

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 63 64 65 66 67 68 < 69 > 70 71 72 73 74 75 .. 204 >> Следующая

Проблема обработки исключений рассматриваемым способом состоит в том, что блок catch не получает информацию о причинах возникновения конкретного исключения, так как ему не передается параметр.
Во втором способе обработки исключений Win32 определяется функция трансляции исключения (exception translator function).
void SETranslate
(unsigned int ExCode, EXCEPTION POINTERS *PtrExPtrs)
Имя этой функции передается в библиотечную функцию _set_se_translator. (Можно изменить имя функции или ее параметров, но не их типы.)
_set_se_translator (SETranslate);
Для вызова setsetranslator необходимо включить в программу файл заголовков Eh.h. Теперь при каждом появлении исключения Win32 будет вызываться функция трансляции исключения. Первый параметр, передаваемый в эту функцию (ExCode), содержит код произошедшего исключения, второй — указывает на структуру с подробной информацией об исключении.
В табл. 8.1 приведен список некоторых общих кодов исключений Win32, задаваемых для параметра ExCode. Чтобы получить доступ к константам первого столбца этой таблицы, просто включите в программу файл WINDOWS.H. Описание информации, доступной с помощью параметра PtrExPtrs, приведено в документации по функции Win32 API : : GetExceptionlnformation в следующих разделах справочной системы: Platform SDK, Windows Base Services, Debugging and Error Handling, Structured Exception Handling, Structured Exception Handling Reference, Structured Exception Handling Functions.
Таблица 8.1. Коды исключений Win32
Код исключения Описание исключения
ехсерт10ы_ассезз_У10ЬАТ10ы Попытка обращения к невыделенному
адресу виртуальной памяти
ЕХСЕРТ10ы_АКРАУ_воиыоз_ЕХСЕЕОЕО Попытка доступа к элементу массива за
его пределами (для контроля границ массива требуется аппаратная поддержка)
ехсертюы_оататуре_м13аысымеыт Попытка доступа к переменной по адресу с неправильным выравниванием: например, 16-битовая переменная должна выравниваться по 2-байтовой границе, а 32-битовая - по 4-байтовой границе
Один из операндов с плавающей запятой слишком мал для представления в данном формате
Делитель в операции деления с плавающей запятой равен нулю
Результат операции с плавающей запятой нельзя точно представить в виде десятичной дроби
Общая ошибка операции с плавающей запятой, т.е. ошибка, отсутствующая в этом списке
Результат операции с плавающей запятой слишком велик для представления в этом формате
EXCEPTION__FLT_DENORMAL_OPERAND
EXCEPTION_FLT_DIVIDE_BY_ZERO EXCEPTION_FLT_INEXACT_RESULT
EXCEPTION_FLT_INVALID_OPERATION
EXCEPTION FLT OVERFLOW
Окончание табл. 8.1
Код исключения Описание исключения
EXCEPTION_ _FLT_ _STACK_CHECK Операция с плавающей запятой приводит к переполнению стека либо к заему из стека
EXCEPTION_ _FLT_ UNDERFLOW Результат операции с плавающей запятой слишком мал для представления в этом формате
EXCEPTION_ _INT_ _DIVIDE_BY_ZERO Делитель операции целочисленного деления равен нулю
EXCEPTION_ _INT_ OVERFLOW Результат целочисленной операции слишком велик для сохранения в виде целого значения (т.е. потерян один или больше старших битов)
EXCEPTION_ _PRIV_INSTRUCTION Попытка выполнения машинной команды, запрещенной на текущем уровне привилегий
Примечание
По умолчанию исключения, генерируемые операциями с плавающей запятой (коды которых начинаются с exception_flt), запрещаются. Если ошибка происходит, операция формирует ноль или максимальное действительное значение. Для обработки таких исключений следует вызвать библиотечную функцию _controlfp.
Транслятор генерирует исключение С++ с использованием значения, переданного в качестве параметра и, возможно, предоставляет дополнительную информацию, например:
void SETranslate
(unsigned int ExCode, _EXCEPTION_POINTERS *PtrExPtrs) {
throw ExCode; }
Если код, вызвавший первоначальное исключение Win32, находится в блоке try, и если существует блок catch соответствующего типа (в примере — unsigned int), то catch активизируется и может использовать информацию из своего параметра для обработки исключения. Например:
catch (unsigned int ExCode) {
// Параметр ExCode содержит идентификатор исключения Win32; // далее оно обрабатывается соответствующим образом ... )
Функция трансляции исключения фактически преобразует исключение Win32 в исключение С++. Заметьте: если транслирующая функция не генерирует исключение явно, то механизм обработки исключений возобновляет поиск обработчика catch (...) так, как если бы транслирующая функция не была предусмотрена (или завершает работу программы выводом окна сообщения, если такой обработчик не найден).
Программа ExTrans.cpp (листинг 8.3) демонстрирует работу функции трансляции исключений.
Листинг 8.3
// ExTrans.cpp: программа, демонстрирующая работу
// функции трансляции исключений Win32 в исключения С++
#include <windows.h>
#include <iostream.h>
#include <eh.h>
class CSExcept {
public:
CSExcept (unsigned int ExCode) {
m__ExCode = ExCode; }
unsigned int GetExCode ( ) (
return m_ExCode; )
private:
unsigned int mJExCode;
};
void SETranslate
Предыдущая << 1 .. 63 64 65 66 67 68 < 69 > 70 71 72 73 74 75 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100