Windows для профессионалов


Перехват структурных исключений в С++ - часть 2


};

Внутри входных функций потоков вызывайте статическую функцию-член Map SEtoCE. В свою очередь она обращается к библиотечной С-функции _set_sefranslator, передавая ей адрес функции TranslateSEtoCE класса CSE. Вызов _set_se_translator сооб щает С++, что при возбуждении структурных исключений Вы хотите вызывать Trans lateSEtoCE. Эта функция вызывает конструктор CSE-объектя и инициализирует два элемента данных машинно-зависимой и машинно-независимой информацией об исключении. Созданный таким образом CSE-объскт может быть вытолкнут ак же, как и любая другая переменная. И теперь Ваш С++-код способен обрабатывать структур ные исключения, захватывая (catching) переменную этого типа.

Вот пример захвата такого С++-объекта.

void Functastic()
{

CSE::MapSEtoCE(); // должна быть вызвана до возникновения исключений

try
{

* (PBYTE) 0 = 0; // нарушение доступа

int x = 0;

x = 5 / x; // деление на нуль

}

catch (CSE se)
{

switch (se)
{

// вызывает функцию-член оператора DWORD()

case EXCEPTION_ACCESS_VIOLATION

// здесь обрабатывается исключение вызванное нарушением доступа
break;

case EXCEPTION_INT_DIVIDE_BY_ZERO

// здесь обрабатывается исключение, вызванное делением на нуль
break;

default:

// другие исключения мы не обрабатываем throw;
// может, какой-нибудь другой блок catch
// обработает это исключение
break;

// никогда не выполняется

}

}

}




Начало  Назад  Вперед



Книжный магазин